2012-04-03 10 views
21

Ho una lista di oggetti in C#. Tutti gli oggetti contengono un ID di proprietà. Esistono diversi oggetti con la stessa proprietà ID.Rimuovere oggetti con una proprietà duplicata dall'elenco

Come è possibile tagliare l'elenco (o creare un nuovo elenco) in cui è presente un solo oggetto per proprietà ID?

[Eventuali duplicati supplementari vengono interrotte dalla lista]

risposta

50

Se si vuole evitare di utilizzare una libreria di terze parti, si potrebbe fare qualcosa di simile:

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

che Will gruppo array la proprietà Id, quindi selezionare la prima voce nel raggruppamento.

+2

questo ha funzionato perfettamente qui è la mia realizzazione:. Lista uniqueRows = inputRows.GroupBy (x => x.Id) .Select (x => x.First()) ToList (); – Baxter

+0

Felice di aiutare! Una nota: il '' sul tuo 'ToList()' è ridondante. Dovresti essere in grado di fare '.ToList()' –

+0

Hai ragione funziona con solo ToList() invece di ToList () – Baxter

12

AltroLINQ DistinctBy() farà il lavoro, consente di utilizzare la proprietà dell'oggetto per la nitidezza. Sfortunatamente costruito in LINQ Distinct() non flessibile.

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

DistinctBy()

Riporta tutti elementi distinti della sorgente proposta, dove "distinzione" è determinata tramite una proiezione e l'operatore di confronto predefinito eqaulity per il tipo proiettata.

PS: I crediti verso Jon Skeet per la condivisione di questa libreria con la comunità

+0

Penso che questa sia un'ottima soluzione ma sto cercando di evitare di usare una libreria di terze parti per questo . Grazie. – Baxter

+2

Fortunatamente puoi vedere come viene implementato – sll

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

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

More LINQ a google code

O se non si desidera utilizzare DLL esterne per qualche motivo, è possibile utilizzare questo Distinct overload:

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

Usage:

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

Perché il downvote? – gdoron

4

Non sono sicuro se qualcuno è ancora alla ricerca di ulteriori modi per farlo. Ma ho usato questo codice per rimuovere i duplicati da un elenco di oggetti utente basato su numeri ID corrispondenti.

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

Chiama: SearchResults = RemoveSearchDuplicates (SearchResults);

Problemi correlati