GroupBy然后对每个组的结果进行聚合
本文关键字:结果 然后 GroupBy | 更新日期: 2023-09-27 17:59:00
我对LINQ to对象中的groupby
行为感到困惑。让我们假设我有以下类;
public class person
{
public string name { get; set; }
public int age { get; set; }
}
比方说我有一个列表或键入人;List<person> people
现在,我想生成一个具有IGrouping或匿名类型的IEnumerable<T>
,它具有两个属性:1)名称(密钥)和2)具有该名称的人的所有年龄的总和。
以下是我尝试过(但没有成功)的几个例子;
people.GroupBy(x => x.name, x => x, (key, value) => value.Aggregate((c, n) => c + n));
这不会编译为错误cannot convert type "int" to "namespace.person"
在此之前,我尝试了一些更类似于;
people.GroupBy(x => x.name).Select(g => new { g.Key, g.Aggregate((c, n) => c + n)) } );
这基本上给出了相同的错误。我基本上很难理解GroupBy
返回的值到底是什么。起初,我认为基本重载给了我一个键值对,其中x.Key
是我与委托指定的键,x.Value
是IEnumerable<T>
,其中T
的类型是x
的类型。当然,如果是这样的话,我的第二个例子会很有魅力。我的问题有些开放,但有人能解释两件事吗;如何使用LINQ实现我的最终目标?第二,为什么GroupBy
的结果不更像我在这里描述的那样?它是什么?我觉得这是一个键值对,其中的值是与该键匹配的对象的集合,这比实际返回的要直观得多。
var grouped = people.GroupBy(x => x.name)
.Select(x => new
{
Name = x.Key,
Age = x.Sum(v => v.age),
Result = g.Aggregate(new Int32(), (current, next) => next.age + next.age)
});
如果你愿意,你可以再次按名称对结果进行分组,这将是一个以Key为名称、Age为值的分组。
您可以使用表达式语法
var results = from p in persons
group p.car by p.name into g
select new { name = g.Key, age = g.Sum(c=>.age };