我有一个
IEnumerable
,有些条目有重复的 Name
。我想删除那些重复的条目。
例如,如果
Name
是 : "Prag1"
:
首先我想检查我的
IEnumerable
中是否有多个具有该名称的条目
如果是,那么我想删除一个元素并保留另一个元素
我已经尝试过,但对我不起作用:
data.ToList().Remove(data.ToList().Find(x => x.Name == "Prag1));
更新:
Distinct
对我不起作用,因为在我的列表中还有一个名为 Date
的字段,并且其值不同。
因此,如果 Company1 中的第一个记录日期是 11 月 15 日,则第二个条目的日期可能是 11 月 22 日
如果你想要纯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);
根据我的说法,将 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());