Le Distinct() de LINQ sur une propriété particulière
Source : Stack Overflow.)
EDIT : Ceci fait désormais partie de MoreLINQ.
Ce dont vous avez besoin est en fait un “distinct-by”. Je ne pense pas que cela fasse partie de LINQ tel quel, bien que ce soit assez facile à écrire :
public static IEnumerable<TSource> DistinctBy<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (seenKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
Ainsi, pour trouver les valeurs distinctes en utilisant uniquement la propriété Id, vous pourriez utiliser :
var query = people.DistinctBy(p => p.Id);
Et pour utiliser plusieurs propriétés, vous pouvez utiliser des types anonymes, qui implémentent l’égalité de manière appropriée :
var query = people.DistinctBy(p => new { p.Id, p.Name });
Non testé, mais cela devrait fonctionner (et maintenant au moins ça compile).
Cela suppose le comparateur par défaut pour les clés - si vous souhaitez passer un comparateur d’égalité, transmettez-le simplement au constructeur du HashSet.