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)
我发现的大多数解决方案都涉及创建新的匿名类型,但这肯定会丢失“分数”字段。
如何创建原始对象的分组,其中对象按多个条件分组?
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)
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)