如何在linq查询中实现group?

时间:2013-02-01 07:34:33

标签: c# linq

我已按照

等查询实施了分组
var query = (from a in Main
             group a by a.Parent into g
             where g.Count() >= 0
             select new
             {
                 parent= g.Key,
                 Name= g.Select(y => y.name).Count(),
                 Contact= g.Select(x => x.contact).Count(),
                 Friends= g.Select(z => z.friends).Count(),
             }).ToArray();

在Main中我得到的记录如

In first list  ====>      Parent="1"
                          name="2"
                          contact=0
                          friends=0 

In second List ===>       Parent="2"
                          name="2"
                          contact=0
                          Friends=0        

但是当我按查询使用群组时,我会以这种方式获得价值

parent="1",Name="2",Contact="2",Friends="2" 

parent="2",Name="3",Contact="2",Friends="2"

而且我还需要每个领域的计数。

所以,请你能告诉我哪里做错了,

先谢谢。

2 个答案:

答案 0 :(得分:0)

首先,在分组后不要使用ToArray()并期望同样的事情。

当您进行常规的Select-Where查询时,将返回的是您转换为数组的IEnumerable

当你执行分组时,差异在于返回类型将是IGrouping,它不会转换为您期望的相同数组。

如果分组,您需要以不同的方式处理输出。


建议:

int nameCount = 0;
int contactCount = 0;
int friendCount = 0;

Main.GroupBy(x => x.Parent).ToDictionary(pair => pair.Key, pair => {
   nameCount += pair.Count(y => y.Name);
  //etc. for the rest of the counters.
}

这样,迭代分组元素的选择器函数将用于总结每个元素的联系人,朋友和名字。我希望我理解你问题的背景。

答案 1 :(得分:0)

g.Select(x => x.friends).Count(),

您可能会混淆Count运算符的含义。 Count计算查询投影的元素的数量,而不是它们的总和。因此,如果g包含2个元素,则g.Select(x => x.anything)将始终返回2,而不管anything属性的值。

我认为你的意思是返回从friends属性投射的值的 sum ,在这种情况下,你应该使用:

g.Sum(x => x.friends),