Essayez-vous d'être distinct par plus d'un champ? Si tel est le cas, utilisez simplement un type anonyme et l'opérateur Distinct et cela devrait être correct:
var query = doc.Elements("whatever")
.Select(element => new {
id = (int) element.Attribute("id"),
category = (int) element.Attribute("cat") })
.Distinct();
Si vous essayez d'obtenir un ensemble distinct de valeurs d'un type "plus grand", mais que vous ne regardez qu'un sous-ensemble de propriétés pour l'aspect de la distinction, vous souhaiterez probablement l' DistinctBy
implémentation dans MoreLINQ dans DistinctBy.cs
:
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
IEqualityComparer<TKey> comparer)
{
HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
(Si vous passez en null
tant que comparateur, il utilisera le comparateur par défaut pour le type de clé.)
Utilisez simplement le
Distinct()
avec votre propre comparateur.http://msdn.microsoft.com/en-us/library/bb338049.aspx
la source
En plus de la réponse de Jon Skeet, vous pouvez également utiliser les expressions group by pour obtenir les groupes uniques avec un décompte pour chaque itération de groupes:
la source
Pour tous ceux qui cherchent encore; voici une autre façon d'implémenter un comparateur lambda personnalisé.
vous pouvez ensuite créer une extension pour le linq Distinct qui peut prendre en lambda
Usage:
la source
Je suis un peu en retard pour la réponse, mais vous voudrez peut-être le faire si vous voulez l'élément entier, pas seulement les valeurs que vous souhaitez regrouper:
Cela vous donnera le premier élément entier correspondant à votre groupe par sélection, un peu comme le deuxième exemple de Jon Skeets utilisant DistinctBy, mais sans implémenter le comparateur IEqualityComparer. DistinctBy sera probablement plus rapide, mais la solution ci-dessus impliquera moins de code si les performances ne sont pas un problème.
la source
la source
Puisque nous parlons d'avoir chaque élément exactement une fois, un «ensemble» a plus de sens pour moi.
Exemple avec des classes et IEqualityComparer implémentés:
Maintenant
setList
aura des éléments uniquesJ'ai pensé à cela en traitant de
.Except()
ce qui renvoie une différence d'ensemblela source