You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# LINQ查询:仅用group子句从集合提取多组(嵌套分组?)

解决方案

没问题,咱们可以用纯LINQ查询语法结合group by来实现这个需求,既能按年龄分成指定的三组,又能直接访问每个分组里人员的姓名,还不需要写三个单独的内部foreach。

1. 先定义Person类

首先咱们先把基础的Person类写出来:

public class Person
{
    public int Age { get; set; }
    public string Name { get; set; }
}

2. 纯查询语法实现分组

咱们可以直接在group by子句里计算每个人员对应的分组键(也可以用let关键字先定义分组键,让代码更清晰),然后按这个键分组,这样每个分组会包含对应组的所有Person对象,自然就能访问Name和Age属性了。

示例代码如下:

// 模拟测试数据
var people = new List<Person>
{
    new Person { Name = "Alice", Age = 16 },
    new Person { Name = "Bob", Age = 25 },
    new Person { Name = "Charlie", Age = 40 },
    new Person { Name = "Diana", Age = 17 },
    new Person { Name = "Eve", Age = 30 }
};

// 纯查询语法实现年龄分组
var ageGroups = from person in people
                group person by 
                    // 定义分组逻辑,你可以根据需求调整年龄阈值
                    person.Age < 18 ? "少年组" : 
                    person.Age < 35 ? "青年组" : "中年组" into ageGroup
                select new
                {
                    GroupName = ageGroup.Key, // 分组名称
                    GroupMembers = ageGroup   // 该组的所有人员
                };

3. 遍历分组结果

现在只需要一次外层循环就能遍历所有分组,每个分组内部遍历成员即可,不需要写三个单独的foreach:

foreach (var group in ageGroups)
{
    Console.WriteLine($"=== {group.GroupName} ===");
    foreach (var person in group.GroupMembers)
    {
        Console.WriteLine($"姓名:{person.Name},年龄:{person.Age}");
    }
}

为什么这样可行?

  • 我们直接将每个Person对象按计算出的分组键进行分组,所以每个分组的结果是包含该组所有人员的集合,而非仅仅是分组键,因此可以直接访问Name属性。
  • 整个实现完全使用LINQ查询语法,没有用到join,符合你的要求。
  • 只需要一个外层循环遍历所有分组,避免了重复编写三个内部foreach的冗余代码。

内容的提问来源于stack exchange,提问作者Darkbound

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:08:06