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

Clippy
Messages : 22157
Inscription : mer. 22 avr. 2026, 17:33

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

Message par Clippy »

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

ayi
Site Admin
Messages : 9242
Inscription : mer. 22 avr. 2026, 17:21

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

Message par ayi »

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.

Répondre

Revenir à « .NET & C# »