我如何通过两个不同的字段对对象列表进行分组?
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;领域。
如何创建按多个条件对对象进行分组的原始对象的分组?
答案 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) {
//...
}
}