如何用LINQ Lambda表达式筛选非重复项及重复项首条记录(忽略大小写)
解决方案:基于Name忽略大小写筛选非重复记录(保留每组第一条)
首先直接上能实现需求的完整代码:
// 你的原始设备列表 List<Dev> devices = new List<Dev>() { new Dev{ Add="5",Name="A" }, new Dev{ Add="5",Name="a" }, new Dev{ Add="9",Name="b" }, new Dev{ Add="6",Name="c" }, new Dev{ Add="9",Name="b" }, }; // 核心LINQ Lambda表达式 var uniqueDevices = devices // 按Name忽略大小写分组,"A"和"a"会被归为同一组 .GroupBy(x => x.Name, StringComparer.OrdinalIgnoreCase) // 取出每个分组的第一条记录——不管分组是单条还是多条 .Select(g => g.First()) .ToList(); // 验证输出 foreach (var dev in uniqueDevices) { Console.WriteLine($"Add={dev.Add}, Name={dev.Name}"); }
运行这段代码后,你会得到预期的输出:
Add=5, Name=A
Add=9, Name=b
Add=6, Name=c
为什么你的原有代码没达到预期?
你之前的代码results.GroupBy(x => x.Name, StringComparer.OrdinalIgnoreCase).Where(g => g.Count() > 1).Select(g => g.Key).ToList()只做了两件事:
- 筛选出有重复的Name(通过
Where(g => g.Count() > 1)) - 只返回这些重复的Name字符串(
Select(g => g.Key))
它既没有保留完整的Dev对象,也没有包含不重复的记录(比如Name为"c"的那条)。
额外扩展:如果需要先排序再取第一条
如果你想在每组内先按某个字段排序(比如按Add升序),再取第一条,可以修改成这样:
var uniqueDevices = devices .GroupBy(x => x.Name, StringComparer.OrdinalIgnoreCase) // 先按Add字段排序,再取第一条 .Select(g => g.OrderBy(x => x.Add).First()) .ToList();
内容的提问来源于stack exchange,提问作者Dot Net Dev
相关产品推荐
相关产品推荐

