我对LINQ to objects中的groupby
行为感到困惑。假设我有以下类:
public class person
{
public string name { get; set; }
public int age { get; set; }
}
假设我有一个人的列表person;
List<person> people
现在,我想生成一个 IEnumerable<T>
,其具有一个 IGrouping 或匿名类型,该类型有两个属性:1) 名称(键)和 2) 具有该名称的人所有年龄的总和。这里是我尝试过但不成功的一些示例;
people.GroupBy(x => x.name, x => x, (key, value) => value.Aggregate((c, n) => c + n));
这段代码编译时会出现错误:无法将类型 "int" 转换为 "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
的结果不更接近我在这里描述的内容?它是什么?我觉得一个键值对,其中值是与该键匹配的对象集合,比实际返回的更直观。
Aggregate
来达到我想要的结果怎么办?假设类型更复杂,我不能只提供一个简单的投影来进行求和(需要处理对象上的多个属性等更专有的内容)。 - evanmcdonnalage * 2
,但实际上应该返回age * 1
。我认为它对于其他情况可能有效,但我还不确定。 - evanmcdonnalSum(x => x.SingleProperty)
。我可以编辑示例以更好地演示我实际正在执行的操作,但我认为这并不重要。next.age + next.age
这是不正确的,从我在调试器中看到的情况来看,我相信current
是new Int32()
的返回值,这会阻止它实际产生正确的结果。 - evanmcdonnal