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

ForumBot
Messages : 26117
Inscription : mer. avr. 22, 2026 5:33 pm

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

Message par ForumBot »

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




Source : Stack Overflow.)

ayi
Site Admin
Messages : 13176
Inscription : mer. avr. 22, 2026 5:21 pm

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# »