2012-04-03 18 views
21

Mam listę obiektów w języku C#. Wszystkie obiekty zawierają identyfikator właściwości. Istnieje kilka obiektów, które mają tę samą właściwość ID.Usuwanie obiektów z duplikatem właściwości z listy

Jak mogę przyciąć Listę (lub utworzyć nową Listę), gdzie jest tylko jeden obiekt na właściwość ID?

[Jakiekolwiek dodatkowe duplikaty są usuwane z listy]

Odpowiedz

50

Jeśli chcesz uniknąć przy użyciu biblioteki innej firmy, można zrobić coś takiego:

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

który będzie grupa tablicę przez właściwość Id, a następnie wybierz pierwszy wpis w grupie.

+2

To działało idealnie tu jest moje wykonanie:. Lista uniqueRows = inputRows.GroupBy (x => x.Id) .Wybrać (x => x.First()) ToList (); – Baxter

+0

Cieszę się, że mogę Ci pomóc! Jedna uwaga: '' na twoim 'ToList()' jest zbędny. Powinieneś być w stanie zrobić '.ToList()' –

+0

Masz rację, działa on tylko z funkcją ToList() zamiast z ToList () – Baxter

12

MoreLINQ DistinctBy() wykona zadanie, pozwala na użycie obiektu proeprty dla odmienności. Niefortunnie zbudowany w LINQ Distinct() niezbyt elastyczny.

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

DistinctBy()

Zwraca wszystkie różne elementy danego źródła, gdzie "odmienność" określony jest za pomocą występu i domyślnej eqaulity comparer dla przewidywanego typu.

PS: Podziękowania dla Jon Skeet za udostępnienie tej biblioteki ze społecznością

+0

Myślę, że jest to świetne rozwiązanie, ale staram się unikać korzystania z biblioteki innej firmy. . Dziękuję Ci. – Baxter

+2

Na szczęście możesz zobaczyć, w jaki sposób jest on implementowany. – sll

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

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

More LINQ na google code

Albo jeśli nie chcesz korzystać z zewnętrznych bibliotek DLL z jakiegoś powodu, można użyć tego Distinct przeciążeniem:

public static IEnumerable<TSource> Distinct<TSource>(
    this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer) 

Zastosowanie:

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

. Dlaczego upadek? – gdoron

4

Nie wiem, czy ktoś wciąż szuka wszelkie dodatkowe sposoby, aby to zrobić. Ale użyłem tego kodu, aby usunąć duplikaty z listy obiektów użytkownika na podstawie zgodnych numerów identyfikacyjnych.

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; 
    } 

Zadzwoń: SearchResults = RemoveSearchDuplicates (SearchResults);