我在C#中有一个对象列表。所有对象都包含属性ID。 有几个对象具有相同的ID属性。
如何在每个ID属性只有一个对象的情况下修剪List(或创建一个新List)?
[从列表中删除任何其他重复项]
答案 0 :(得分:88)
如果您想避免使用第三方库,可以执行以下操作:
fooArray.GroupBy(x => x.Id).Select(x => x.First());
这将按Id属性对数组进行分组,然后选择分组中的第一个条目。
答案 1 :(得分:17)
MoreLINQ DistinctBy()
将完成这项工作,它允许使用object proeprty来实现清晰度。不幸的是,LINQ Distinct()
内置了不灵活的enoght。
var uniqueItems = allItems.DistinctBy(i => i.Id);
<强> DistinctBy()强>
返回给定源的所有不同元素,其中 “清晰度”是通过投影和默认的均衡来确定的 比较投影类型。
PS:向Jon Skeet致信与社区共享此库
答案 2 :(得分:5)
var list = GetListFromSomeWhere();
var list2 = GetListFromSomeWhere();
list.AddRange(list2);
....
...
var distinctedList = list.DistinctBy(x => x.ID).ToList();
在GitHub More LINQ
或者,如果您出于某种原因不想使用外部dll,可以使用此Distinct
重载:
public static IEnumerable<TSource> Distinct<TSource>(
this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
用法:
public class FooComparer : IEqualityComparer<Foo>
{
// Products are equal if their names and product numbers are equal.
public bool Equals(Foo x, Foo y)
{
//Check whether the compared objects reference the same data.
if (Object.ReferenceEquals(x, y)) return true;
//Check whether any of the compared objects is null.
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
return x.ID == y.ID
}
}
list.Distinct(new FooComparer());
答案 3 :(得分:5)
不确定是否有人仍在寻找其他方法来执行此操作。但我已经使用此代码根据匹配的ID号从User对象列表中删除重复项。
private ArrayList RemoveSearchDuplicates(ArrayList SearchResults)
{
ArrayList TempList = new ArrayList();
foreach (User u1 in SearchResults)
{
bool duplicatefound = false;
foreach (User u2 in TempList)
if (u1.ID == u2.ID)
duplicatefound = true;
if (!duplicatefound)
TempList.Add(u1);
}
return TempList;
}
调用:SearchResults = RemoveSearchDuplicates(SearchResults);