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

如何从IEnumerable中移除Name重复的元素(Distinct不适用场景)

解决IEnumerable集合中按Name去重的问题

原代码无效的原因

你写的代码之所以没效果,核心问题是每次调用ToList()都会创建一个全新的List实例:

  • data.ToList()生成列表A,你在这个列表上调用Remove
  • data.ToList().Find(...)生成另一个完全独立的列表B,找到的元素属于列表B
  • 你试图在列表A中移除列表B的元素,自然找不到,移除操作不会生效;就算碰巧生效,列表A只是临时对象,原data也不会被修改

针对特定Name(如"Prag1")的去重方案

如果只需要处理Name="Prag1"的重复项,保留其中一个,可按以下步骤操作:

  1. 先把IEnumerable转为可修改的List(因为IEnumerable本身通常是只读的)
  2. 筛选出所有Name="Prag1"的条目,跳过第一个,移除剩下的重复项

代码示例:

// 转成可修改的List
var mutableList = data.ToList();
// 获取除第一个之外的所有Prag1重复项
var duplicatesToRemove = mutableList.Where(x => x.Name == "Prag1").Skip(1).ToList();

// 逐个移除重复项
foreach (var item in duplicatesToRemove)
{
    mutableList.Remove(item);
}

// 之后使用mutableList作为去重后的集合,若需要替换原data可赋值:data = mutableList;

针对所有Name重复项的通用去重方案

如果要处理集合中所有Name重复的情况(每个Name仅保留一条记录),可以用GroupBy按Name分组,再取每组的第一条数据:

var uniqueData = data.GroupBy(item => item.Name)
                     .Select(group => group.First()) // 也可根据需求取Last()或特定条件的条目
                     .ToList();

这个方案避开了Distinct的局限性——因为Distinct会对比整个对象的所有字段,而GroupBy只按Name分组,完全符合你Date不同但需按Name去重的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:03:21