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
相关产品推荐
相关产品推荐

