LINQ Group使用多个标准

时间:2014-05-01 09:48:16

标签: c# .net linq list grouping

我如何通过两个不同的字段对对象列表进行分组?

e.g。

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*/);

分组将是:

"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

我发现的大多数解决方案都涉及创建一个新的匿名类型,但这肯定会失去&#34;分数&#34;领域。

如何创建按多个条件对对象进行分组的原始对象的分组?

3 个答案:

答案 0 :(得分:3)

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()
           });

您可以使用以下方法检查结果:

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

答案 1 :(得分:2)

使用此:

var grouped = items.GroupBy(item => item new{ item.Name, item.Age });

您不会丢失分数字段。分组列表的子列表仍然是Item类型,匿名类型的对象将在每个组的Key属性中。

答案 2 :(得分:2)

var grouped = items.GroupBy(item => new { item.Name, item.Age });

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

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

foreach (var group in grouped) {
    foreach(Item item in group) {
        //...
    }
}