繁体   English   中英

如何在linq查询中实现分组?

[英]how to implement group by in linq query?

我已经实现了按查询分组

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"

而且我还需要每个字段的数量。

所以请您告诉我我做错了什么

提前致谢。

首先,不要在分组后使用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.
}

这样,遍历分组元素的选择器功能将用于汇总每个元素的联系人,朋友和姓名。 我希望我能理解你的问题的背景。

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

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

我假设您的意思是返回从friends属性投影的值的总和 ,在这种情况下,应使用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM