如何从 IEnumerable 中删除计数> 1的元素[关闭]

问题描述 投票:0回答:2

我有一个

IEnumerable
,有些条目有重复的
Name
。我想删除那些重复的条目。

例如,如果

Name
是 :
"Prag1"
:

  • 首先我想检查我的

    IEnumerable
    中是否有多个具有该名称的条目

  • 如果是,那么我想删除一个元素并保留另一个元素

我已经尝试过,但对我不起作用:

data.ToList().Remove(data.ToList().Find(x => x.Name == "Prag1));

更新

Distinct
对我不起作用,因为在我的列表中还有一个名为
Date
的字段,并且其值不同。

因此,如果 Company1 中的第一个记录日期是 11 月 15 日,则第二个条目的日期可能是 11 月 22 日

c# asp.net-core asp.net-core-webapi ienumerable
2个回答
1
投票

如果你想要纯Linq,你可以尝试DistinctBy

var list = data
  .DistinctBy(item => item.Name)
  .ToList();

对于.Net版本(不提供

DistinctBy
),您可以使用GroupBy
模拟

var list = data
  .GroupBy(item => item.Name)      // For each of groups of items with the same Name  
  .Select(group => group.First())  // we want just first item from the group
  .ToList();

如果您想处理现有

list
,您可以使用
HashSet<T>
来保持唯一的
Name

// Initial list with possible duplicate Names
var list = data.ToList(); 

var unique = new HashSet<string>();

int index = 0;

for (int i = 0; i < list.Count; ++i)
    if (unique.Add(list[i].Name))
        list[index++] = list[i];

list.RemoveRange(index, list.Count - index);

0
投票

根据我的说法,将 IEnumerable 转换为 List 将是修改集合的一种方法。

请参考以下示例实现:

var list = data.ToList(); 
var seenNames = new HashSet<string>(); 

for (int i = list.Count - 1; i >= 0; i--)
{
    if (seenNames.Contains(list[i].Name))
    {
        list.RemoveAt(i); 
    }
    else
    {
        seenNames.Add(list[i].Name); 
    }
}

IEnumerable<T> result = list.AsEnumerable();

如果不需要修改原始集合,您还可以使用 LINQ 创建具有唯一元素的新集合:

var uniqueData = data.GroupBy(x => x.Name)
                     .Select(g => g.First());
© www.soinside.com 2019 - 2024. All rights reserved.