LINQ中的GroupBy如何工作?

我最初有一个名为rowsDictionary<string, List> rowsDictionary

现在,对于该字典的每个键,我按照以下标准对其值列表进行分组:

  Dictionary<string, List> providerGroups = rowsDictionary.ToDictionary( x => x.Key, v => v.Value.GroupBy(x => new { x.GroupID, x.GroupFin, x.ZipCode }) .Select(x => x.First()) .ToList()); 

例如,如果key["1234"]最初在其值列表中有6个项目,那么现在它可能有两个基于该分组的项目。 我的问题和困惑是其他价值观会发生什么? (这四个)以及将为这组返回的这两个列表的值是什么?

通过将您正在分组的任何内容分组并将其放入与您在group by子句中指定的键匹配的项集合进行分组。

如果您有以下数据:

 Member name Group code Betty 123 Mildred 123 Charli 456 Mattilda 456 

以及以下查询

 var query = from m in members group m by m.GroupCode into membersByGroupCode select membersByGroupCode; 

group by将返回以下结果:

在此处输入图像描述

您通常不希望直接选择分组。 如果我们只想要没有所有其他多余数据的组代码和成员名称怎么办?

我们只需要执行select来获取我们之后的数据:

 var query = from m in members group m by m.GroupCode into membersByGroupCode let memberNames = from m2 in membersByGroupCode select m2.Name select new { GroupCode = membersByGroupCode.Key, MemberNames = memberNames }; 

返回以下结果:

在此处输入图像描述

哪些值将进入为组返回的列表?

每组的第一个,因为你这样做:

 .Select(x => x.First()) 

其余值会发生什么变化?

它们不会被投射到目标词典中。

您的LINQ group by query采用原始列表,对其执行其他分组,然后根据该分组修剪列表。

考虑一个列表包含以下项目的情况:

 GroupID GroupFin ZipCode Name ------- -------- ------- ---- 1 1 94111 A 1 1 94111 B 1 1 94111 C 1 1 94111 D 1 2 94110 E 1 2 94110 F 

分组将从这六个列表中分成两组:

 GroupID=1 GroupFin=1 ZipCode=94111 GroupID=1 GroupFin=2 ZipCode=94110 

第一组包含提供者A,B,C和D; 第二组将包含E和F.

您的查询接下来要做的就是应用First 。 此操作从组中选择初始项目; 在这种情况下,它将是A和E.其余项目将被忽略。