233 votos

Eliminar los duplicados de la lista mediante linq

Tengo una clase Items con properties (Id, Name, Code, Price) .

La lista de Items se rellena con elementos duplicados.

Por ejemplo..:

1         Item1       IT00001        $100
2         Item2       IT00002        $200
3         Item3       IT00003        $150
1         Item1       IT00001        $100
3         Item3       IT00003        $150

¿Cómo eliminar los duplicados de la lista utilizando linq?

487voto

Freddy Puntos 2081
var distinctItems = items.GroupBy(x => x.Id).Select(y => y.First());

320voto

Christian Hayter Puntos 17999
var distinctItems = items.Distinct();

Para hacer coincidir sólo algunas de las propiedades, cree un comparador de igualdad personalizado, por ejemplo

class DistinctItemComparer : IEqualityComparer<Item> {

    public bool Equals(Item x, Item y) {
        return x.Id == y.Id &&
            x.Name == y.Name &&
            x.Code == y.Code &&
            x.Price == y.Price;
    }

    public int GetHashCode(Item obj) {
        return obj.Id.GetHashCode() ^
            obj.Name.GetHashCode() ^
            obj.Code.GetHashCode() ^
            obj.Price.GetHashCode();
    }
}

Entonces úsalo así:

var distinctItems = items.Distinct(new DistinctItemComparer());

33voto

tvanfosson Puntos 268301

Si hay algo que está desviando su consulta Distinct, es posible que quiera mirar MásLinq y utilizar el operador DistinctBy y seleccionar objetos distintos por id.

var distinct = items.DistinctBy( i => i.Id );

15voto

Brian Rasmussen Puntos 68853

Utilice Distinct() pero ten en cuenta que utiliza el comparador de igualdad por defecto para comparar valores, así que si quieres algo más que eso tienes que implementar tu propio comparador.

Por favor, vea http://msdn.microsoft.com/en-us/library/bb348436.aspx para un ejemplo.

3voto

Arun Kumar Puntos 11
            List<Employee> employees = new List<Employee>()
        {
            new Employee{Id =1,Name="AAAAA"}
           , new Employee{Id =2,Name="BBBBB"}
           , new Employee{Id =3,Name="AAAAA"}
           , new Employee{Id =4,Name="CCCCC"}
           , new Employee{Id =5,Name="AAAAA"}
        };

        List<Employee> duplicateEmployees = employees.Except(employees.GroupBy(i => i.Name).Select(ss => ss.FirstOrDefault())).ToList();

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X