然后GroupBy对每个组的结果进行聚合

时间:2014-04-17 21:09:39

标签: c# linq group-by

我对LINQ对象中的groupby行为感到困惑。让我们假设我有以下类;

public class person
{
   public string name { get; set; }
   public int age { get; set; }
}

假设我有一个列表或类型的人; List<person> people

现在,我想生成一个具有IGrouping或匿名类型的IEnumerable<T>,它具有两个属性:1)名称(密钥)和2)具有该名称的人的所有年龄的总和。 / p>

以下是我尝试过的一些例子(不成功);

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的结果与我在这里所描述的不同?它是什么?我觉得它是一个键值对,其中值是与该键匹配的对象集合,比实际返回的对象更直观。

2 个答案:

答案 0 :(得分:3)

 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为值

答案 1 :(得分:0)

你可以用表达式语法

来做
var results = from p in persons
              group p.car by p.name into g
              select new { name = g.Key, age = g.Sum(c=>.age };