LINQ Group 通过使用多个条件

Nic*_*ell 0 .net c# linq grouping list

我将如何按照两个不同的字段对对象列表进行分组?

例如

struct Item
{
    public string Name;
    public int Age;
    public int Score;
}

List<Item> items = new List<Item>();
items.Add(new Item(){ "Jeff", 35, 50};
items.Add(new Item(){ "Annie", 22, 45};
items.Add(new Item(){ "Pierce", 60, 90};
items.Add(new Item(){ "Pierce", 60, 10};
items.Add(new Item(){ "Abed", 28, 22};
items.Add(new Item(){ "Troy", 22, 45};
items.Add(new Item(){ "Troy", 22, 65};
items.Add(new Item(){ "Troy", 22, 80};
items.Add(new Item(){ "Troy", 21, 2};
items.Add(new Item(){ "Troy", 21, 5};

var grouped = items.GroupBy(/*Group by age then name*/);
Run Code Online (Sandbox Code Playgroud)

分组后将是:

"Troy", 21, 2
"Troy", 21, 5

"Annie", 22, 45

"Troy", 22, 80
"Troy", 22, 65
"Troy", 22, 45

"Abed", 28, 22

"Jeff", 35, 50

"Pierce", 60, 90
"Pierce", 60, 10
Run Code Online (Sandbox Code Playgroud)

我发现的大多数解决方案都涉及创建新的匿名类型,但这肯定会丢失“分数”字段。

如何创建原始对象的分组,其中对象按多个条件分组?

Den*_*s_E 6

var grouped = items.GroupBy(item => new { item.Name, item.Age });
Run Code Online (Sandbox Code Playgroud)

这将产生一个IGrouping<TKey, TElement> 其中 TKey 是匿名类型,TElement 是 Item。基本上,这是 IEnumerable 的 IEnumerable。

您可以使用双 for 循环访问它们:

foreach (var group in grouped) {
    foreach(Item item in group) {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)


Far*_*yev 5

GroupBy方法返回一个对象集合IGrouping<(Of <(TKey, TElement>)>),每个对象对应遇到的每个不同的键。键表示 中每个值所共有的属性,IGrouping<(Of <(TKey, TElement>)>)并且可以使用循环来访问ForEach

  var qry = items.GroupBy(item => new { item .Age, item .Name },
           (key, group) => new
           {
               Key1 = key.Age,
               Key2 = key.Name,
               All = group.ToList()
           });
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令检查结果:

qry.ToList().ForEach(x => x.All.ForEach(y=>Console.WriteLine("{0}, {1}, {2}",y.Name, y.Age, y.Score)));
Run Code Online (Sandbox Code Playgroud)