C# LINQ 按属性分组后对空、非空键执行不同筛选规则的实现问题
C# 自定义类列表LINQ分组筛选实现方案
你原有代码的核心问题是Select分支返回值类型不统一:非空键分组返回单个ABC实例,空/Null键分组返回分组集合,最终得到的列表元素类型不统一,无法得到你预期的全ABC类型的5条结果。
正确实现代码
通过SelectMany将每个分组的返回结果统一为IEnumerable<ABC>后自动展平即可:
var result = list.GroupBy(x => x.A) .SelectMany(g => { if (!string.IsNullOrEmpty(g.Key)) // 非空有效键仅返回分组第一个元素,包装为单元素集合 return new[] { g.First() }; // 空/Null键返回分组全部元素 return g; }) .ToList();
效果验证
运行后result.Count值为5,完全匹配需求:
- 键为
"a"的分组返回1条 - 键为
null的分组返回2条 - 键为
""的分组返回2条
简化写法
可以用三元运算符压缩逻辑:
var result = list.GroupBy(x => x.A) .SelectMany(g => string.IsNullOrEmpty(g.Key) ? g : new[] { g.First() }) .ToList();
内容的提问来源于stack exchange,提问作者Big Smile
相关产品推荐
相关产品推荐

