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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:30:59