我有一个C#中的对象列表。所有对象都包含一个属性ID。 有几个对象具有相同的ID属性。从列表中删除重复属性的对象
如何修剪列表(或创建一个新的列表)每个ID属性只有一个对象?
[任何额外的副本都跌出名单]
我有一个C#中的对象列表。所有对象都包含一个属性ID。 有几个对象具有相同的ID属性。从列表中删除重复属性的对象
如何修剪列表(或创建一个新的列表)每个ID属性只有一个对象?
[任何额外的副本都跌出名单]
如果你想避免使用第三方库,你可以这样做:
fooArray.GroupBy(x => x.Id).Select(x => x.First());
将由组阵列Id属性,然后选择分组中的第一个条目。
MoreLINQ DistinctBy()
会做这项工作,它允许使用对象proeprty的独特性。不幸地建在LINQ Distinct()
不灵活enoght。
var uniqueItems = allItems.DistinctBy(i => i.Id);
DistinctBy()
返回给定源,其中 “独特性”通过投影和默认eqaulity 比较器对于投影类型确定的所有不同的元素。
PS:贷Jon Skeet为
var list = GetListFromSomeWhere();
var list2 = GetListFromSomeWhere();
list.AddRange(list2);
....
...
var distinctedList = list.DistinctBy(x => x.ID).ToList();
More LINQ
在google code
或者,如果你不想使用外部的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());
为什么downvote? – gdoron 2012-04-03 12:29:22
不知道是否有人还在寻找任何附加如何做到这一点。但是我使用这段代码根据匹配的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);
这工作完全这里是我的实现。 列表 uniqueRows = inputRows.GroupBy(X => x.Id)。选择(X => x.First())ToList (); –
Baxter
2012-04-03 13:24:53
很高兴帮助!一个注意:你的'ToList()'上的''是多余的。你应该能够做'.ToList()' –
2012-04-03 13:43:40
你说得对,它只用ToList()而不是ToList() –
Baxter
2012-04-03 16:20:16