【问题标题】:LINQ Nested group syntaxLINQ 嵌套组语法
【发布时间】:2019-03-17 00:27:09
【问题描述】:

MSDN 在解释 LINQ 中的嵌套组方面做得非常糟糕: https://docs.microsoft.com/en-us/dotnet/csharp/linq/create-a-nested-group

举个例子:

IEnumerable<IGrouping<Gender, IGrouping<Job, Person>>> query =
    from person in peopleList
    group person by person.Gender into genderGroup
    from jobGroup (
      from person in genderGroup
      group person by person.Job
    )
    group jobGroup by genderGroup.Key;

我的问题:

  1. 在括号之间的from子句中,为什么源必须是genderGroup?为什么它不能像第一个 from 子句一样来自 peopleList?
  2. 在最后一个子句中,当将 jobGroup 的哪个属性与 genderGroup.Keys 进行比较时,实际上是在查看它的哪个属性?

【问题讨论】:

    标签: c# linq grouping nested-groups


    【解决方案1】:
    from person in genderGroup
    group person by person.Job
    

    这个子查询迭代了相同性别的人,所以它按工作对男性进行分组,然后按工作对女性进行分组,依此类推。如果使用peopleList 而不是genderGroup,则查询只会按工作对学生进行分组,不会有嵌套分组。

    group jobGroup by genderGroup.Key;
    

    这会根据外部群体的关键(性别)对内部群体而不是人进行分组。假设有四个jobGroup:男程序员、男设计师、女程序员、女设计师。查询按性别对这四个组进行分组,从而生成一个嵌套组:

    male (outer group's key)
        male programmers 
        male designers
    female (outer group's key)
        female programmers 
        female designers
    

    为了更好地理解,我建议你在 Visual Studio 和set breakpoints inside the LINQ statement 中运行这个小代码,看看会发生什么。

    【讨论】:

    • 关于第一个解释的问题(关于子查询):我知道使用 from genderGroup 与使用 peopleList 不同,但是既然你稍后按性别组对 jobGroups 进行分组,不是吗按性别对它们进行两次分组有点加倍?
    • @INEEDANSWERS 在group person by person.Gender into genderGroup 之后,每个genderGroup 都会被迭代。如果您在子查询中改用peopleList,则将针对每个性别组迭代整个peopleList。这样同一个人会在结果中出现多次(取决于有多少性别)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多