LINQ中的GroupBy如何工作?

时间:2014-08-05 13:55:56

标签: c# linq linq-group

我最初有<string, List<ProviderSummary>>字典rowsDictionary

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

    Dictionary<string, List<ProviderSummary>> 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个项目,那么现在它可能有两个基于该分组的项目。我的问题和困惑是其他价值观会发生什么? (这四个)以及将为这组返回的这两个列表的值是什么?

3 个答案:

答案 0 :(得分: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将返回以下结果:

enter image description here

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

我们只需要执行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
            };

返回以下结果:

enter image description here

答案 1 :(得分:3)

  

将为该组返回的列表中包含哪些值?

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

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

其余值会发生什么变化?

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

答案 2 :(得分:3)

您的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.其余项目将被忽略。