Le Distinct() de LINQ sur une propriété particulière

Le Distinct() de LINQ sur une propriété particulière

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.