2012-04-03 188 views
21

我有一个C#中的对象列表。所有对象都包含一个属性ID。 有几个对象具有相同的ID属性。从列表中删除重复属性的对象

如何修剪列表(或创建一个新的列表)每个ID属性只有一个对象?

[任何额外的副本都跌出名单]

回答

50

如果你想避免使用第三方库,你可以这样做:

fooArray.GroupBy(x => x.Id).Select(x => x.First()); 

将由组阵列Id属性,然后选择分组中的第一个条目。

+2

这工作完全这里是我的实现。 列表 uniqueRows = inputRows.GroupBy(X => x.Id)。选择(X => x.First())ToList (); – Baxter 2012-04-03 13:24:53

+0

很高兴帮助!一个注意:你的'ToList()'上的''是多余的。你应该能够做'.ToList()' – 2012-04-03 13:43:40

+0

你说得对,它只用ToList()而不是ToList () – Baxter 2012-04-03 16:20:16

12

MoreLINQ DistinctBy()会做这项工作,它允许使用对象proeprty的独特性。不幸地建在LINQ Distinct()不灵活enoght。

var uniqueItems = allItems.DistinctBy(i => i.Id); 

DistinctBy()

返回给定源,其中 “独特性”通过投影和默认eqaulity 比较器对于投影类型确定的所有不同的元素。

PS:贷Jon Skeet

+0

我认为这是一个很好的解决方案,但我试图避免使用第三方库。谢谢。 – Baxter 2012-04-03 13:26:32

+2

幸运的是你可以看到它是如何实现的 – sll 2012-04-03 13:40:50

4
var list = GetListFromSomeWhere(); 
var list2 = GetListFromSomeWhere(); 
list.AddRange(list2); 

.... 
... 
var distinctedList = list.DistinctBy(x => x.ID).ToList(); 

More LINQgoogle 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()); 
+0

为什么downvote? – gdoron 2012-04-03 12:29:22

4

不知道是否有人还在寻找任何附加如何做到这一点。但是我使用这段代码根据匹配的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);