2012-04-03 23 views
21

Tengo una lista de objetos en C#. Todos los objetos contienen una identificación de propiedad. Hay varios objetos que tienen la misma propiedad de ID.Eliminar objetos con una propiedad duplicada de la lista

¿Cómo puedo recortar la Lista (o crear una nueva Lista) donde solo hay un objeto por propiedad de ID?

[duplicados adicionales se dejan caer fuera de la lista]

Respuesta

50

Si desea evitar el uso de una biblioteca de terceros, que podría hacer algo como:

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

que agrupará la matriz por la propiedad Id, luego seleccione la primera entrada en la agrupación.

+2

Esto funcionó a la perfección aquí es mi aplicación:. Lista uniqueRows = inputRows.GroupBy (x => x.Id) .Elija (x => x.First()) ToList (); – Baxter

+0

¡Me alegra ayudar! Una nota: el '' en su 'ToList()' es redundante. Debería poder hacer '.ToList()' –

+0

Tiene razón, trabaja con ToList() en lugar de ToList () – Baxter

12

MoreLINQ DistinctBy() hará el trabajo, permite usar el objeto proeprty para la distinción. Desafortunadamente construido en LINQ Distinct() no es flexible enoght.

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

DistinctBy()

Devuelve todos los elementos distintos de la fuente dada, donde "distinción" se determina a través de una proyección y el comparador eqaulity predeterminado para el tipo proyectada.

PD: Créditos a Jon Skeet para compartir esta biblioteca con la comunidad

+0

Creo que esta es una gran solución, pero estoy tratando de evitar el uso de una biblioteca de terceros para este . Gracias. – Baxter

+2

Afortunadamente, puede ver cómo se implementa – sll

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

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

More LINQ en google code

O si no desea utilizar archivos DLL externa por alguna razón, usted puede utilizar este Distinct sobrecarga:

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

Uso:

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

¿Por qué el voto a favor? – gdoron

4

No estoy seguro si alguien todavía está buscando cualquier adicional formas de hacer esto. Pero utilicé este código para eliminar duplicados de una lista de objetos de usuario basada en números de identificación coincidentes.

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

Llamar: SearchResults = RemoveSearchDuplicates (SearchResults);

Cuestiones relacionadas