如何在 LINQ 查询中实现分组依据

本文关键字:实现 LINQ 查询 | 更新日期: 2023-09-27 17:57:11

我已经实现了按查询分组,例如

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();
其中,如

在主要我得到的记录,如

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"

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

所以请你说出我哪里做错了,

提前谢谢。

如何在 LINQ 查询中实现分组依据

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

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

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

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

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

这样,循环访问分组元素的选择器函数将用于汇总每个元素的联系人、朋友和姓名。我希望我理解你问题的上下文。