2012-04-03 187 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);