<p><strong>EDIT</strong> : Ceci fait désormais partie de <a href="https://github.com/morelinq/MoreLINQ">MoreLINQ</a>.</p>
<p>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 :</p>
<pre><code class="lang-auto">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;
}
}
}
</code></pre>
<p>Ainsi, pour trouver les valeurs distinctes en utilisant uniquement la propriété <code>Id</code>, vous pourriez utiliser :</p>
<pre><code class="lang-auto">var query = people.DistinctBy(p => p.Id);
</code></pre>
<p>Et pour utiliser plusieurs propriétés, vous pouvez utiliser des types anonymes, qui implémentent l’égalité de manière appropriée :</p>
<pre><code class="lang-auto">var query = people.DistinctBy(p => new { p.Id, p.Name });
</code></pre>
<p>Non testé, mais cela devrait fonctionner (et maintenant au moins ça compile).</p>
<p>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 <code>HashSet</code>.</p>