178 votes

Distinct par propriété de classe par linq

J'ai une collection:

 List<Car> cars=new List<Car>
 

Les voitures sont identifiées de manière unique par CarCode.

J'ai trois voitures dans la collection et deux avec des codes de voiture identiques.

Comment utiliser LINQ pour convertir cette collection en voitures avec des codes de voiture uniques?

321voto

Guffa Points 308133

Vous pouvez utiliser le regroupement et obtenir la première voiture de chaque groupe:

 List<Car> distinct =
  cars
  .GroupBy(car => car.CarCode)
  .Select(g => g.First())
  .ToList();
 

126voto

Jon Skeet Points 692016

Utilisez MoreLINQ , qui a une méthode DistinctBy :)

 IEnumerable<Car> distinctCars = cars.DistinctBy(car => car.CarCode);
 

(Ceci est uniquement pour LINQ to Objects, remarquez.)

55voto

Même approche que Guffa mais comme méthode d'extension:

 public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> items, Func<T, TKey> property)
{
    return items.GroupBy(property).Select(x => x.First());
}
 

Utilisé comme:

 var uniqueCars = cars.DistinctBy(x => x.CarCode);
 

32voto

Anthony Pegram Points 58528

Vous pouvez implémenter un IEqualityComparer et l'utiliser dans votre extension Distinct.

 class CarEqualityComparer : IEqualityComparer<Car>
{
    #region IEqualityComparer<Car> Members

    public bool Equals(Car x, Car y)
    {
        return x.CarCode.Equals(y.CarCode);
    }

    public int GetHashCode(Car obj)
    {
        return obj.CarCode.GetHashCode();
    }

    #endregion
}
 

Et alors

 var uniqueCars = cars.Distinct(new CarEqualityComparer());
 

1voto

JwJosefy Points 86

Une autre façon de faire la même chose ...

 List<Car> distinticBy = cars
    .Select(car => car.CarCode)
    .Distinct()
    .Select(code => cars.First(car => car.CarCode == code))
    .ToList();
 

Il est possible de créer une méthode d'extension pour le faire de manière plus générique. Il serait intéressant que quelqu'un évalue la performance de ce "DistinctBy" par rapport à l'approche GroupBy.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X