在linq中使用GroupBy时,如何获取组名列表?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在linq中使用GroupBy时,如何获取组名列表?相关的知识,希望对你有一定的参考价值。

如果原始集合具有属性prop的对象:

prop = "a";
prop = "a";
prop = "b";
prop = "b";
prop = "c";

而且我按道具分组,我需要输出:

List<string>{ "a", "b", "c" }
答案

例如。

public class Foo
{
    public string PropertyA { get; set; }
    public string PropertyB { get; set; }
}

以下代码分组:

var foos = new List<Foo>();
var groupings = from foo in foos
                group foo by foo.PropertyA
                into groupedFoos
                select groupedFoos;
/*
// the same as
var groupings = foos.GroupBy(foo => foo.PropertyA);
*/
var keys = from grouping in groupings
           select grouping.Key;

.GroupBy()将返回IEnumerable<IGrouping<TKey, TSource>>

如果你只想要不同的属性,你仍然可以去.Distinct(),例如:

var keys = (from foo in foos
            select foo.PropertyA).Distinct();
另一答案

更新

我单独使用Distinct()的原始答案是不够的。您需要按支持值分组,然后选择每个子集的第一个成员:

myList.GroupBy(i => i.prop).Select(i => i.First()).ToList().ForEach(i => Console.Write(i.prop + ", "));

演示代码

这是一些说明分组的代码。

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var myList = new List<Foo>() { 
                new Foo(){ prop = "a", anotherProp = "z"},
                new Foo(){ prop = "a", anotherProp = "x"},
                new Foo(){ prop = "b", anotherProp = "x"},
                new Foo(){ prop = "b", anotherProp = "y"},
                new Foo(){ prop = "c", anotherProp = "z"}
            };

            // Display groups.
            myList.GroupBy(i => i.prop).ToList().ForEach(j =>
            {
                Console.WriteLine("	");
                j.ToList().ForEach(k => Console.Write(k.prop + ", "));
            });

            Console.WriteLine();
            Console.WriteLine(new string('-', 25));

            // Display desired output.
            myList.GroupBy(i => i.prop).Select(i => i.First()).ToList().ForEach(i => Console.Write(i.prop + ", "));
            Console.WriteLine();
        }
    }
    public class Foo
    {
        public string prop { get; set; }
        public string anotherProp { get; set; }
    }
}
另一答案

如果你更喜欢:

stuff.GroupBy(e => e.prop).Select(group => group.Key)
另一答案

使用group by仅通过比较功能提供单个项目。如果比较由prop完成,它将仅返回具有不同prop的对象。你需要做的就是迭代它们并只选择prop

另一答案
List<strings> groups context.YourObjects.Select(o => o.prop).Distinct().ToList();
另一答案
var q = from a in yourList 
group a by a.prop into b
select b.Key;
另一答案
List<MyClass> source = getSource();

List<IGrouping<KeyType, MyClass>> groups = source
  .GroupBy(x => x.prop)
  .ToList();

List<KeyType> keys = groups
  .Select(g => g.Key)
  .ToList();

以上是关于在linq中使用GroupBy时,如何获取组名列表?的主要内容,如果未能解决你的问题,请参考以下文章

访问第一个组元素时无法翻译 First() (Linq GroupBy)

如何选择组中的最后一行

如何在构建 XDocument 时执行 LINQ 查询?

如何在linq C#中使用group by并获取记录列表[重复]

在 LINQ Lambda 表达式中使用 GroupBy、Count 和 Sum

如何通过 join 和 group by 在 C# Linq 中获取 Min?