Distinctes par la propriété de la classe avec LINQ
J'ai une collection:
List<Car> cars = new List<Car>();
Voitures sont identifiés de manière unique par leur propriété CarCode
.
J'ai trois voitures dans la collection, et deux à l'identique CarCodes.
Comment puis-je utiliser LINQ to convertir cette collection de Voitures uniques CarCodes?
- Connexes / double possible de: LINQ Distinct() sur une propriété donnée
- Double Possible de LINQ Distinct() sur une propriété donnée
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le groupement, et d'obtenir la première voiture de chaque groupe:
First()
est totalement d'accord, dans ce cas d'utilisation.Utilisation MoreLINQ, qui a un
DistinctBy
méthode 🙂(Ce n'est que pour LINQ to Objects, vous l'esprit.)
NO_HASHSET
est vrai...)? Merci beaucoup!IQueryable<T>
et essayer deDistinctBy
et ainsi interroger l'ensemble de god damn table... N'est-il pas de commettre des erreurs? Merci encore de votre extrêmement rapide réponse!IQueryable<T>
pour quelque chose dans l'attenteIEnumerable<T>
.System.Linq
espace de noms, donc pas besoin d'en ajouter d'autres de l'usage de chaque fichier qui souhaite accéder à ces fonctionnalités?System
que qui donne une fausse impression d'être "officiel". Mais vos goûts peuvent varier, bien sûr 🙂Même approche que Guffa mais comme une extension de la méthode:
Utilisé comme:
Vous pouvez mettre en œuvre un IEqualityComparer et utilisez-la dans votre Distinct de l'extension.
Et puis
cars.Distinct(new GenericEqualityComparer<Car>((a,b) => a.CarCode == b.CarCode, x => x.CarCode.GetHashCode()))
. J'ai utilisé, par exemple, dans le passé, comme c'est parfois le ajoute de la valeur lors de l'exécution d'un arrêt Distinct.Une autre méthode d'extension pour Linq-to-Objets, sans l'aide de GroupBy:
Je pense que la meilleure option en Termes de performances (ou en des termes) est défini à l'aide de la IEqualityComparer interface.
Bien que la mise en œuvre chaque fois qu'un nouveau programme pour chaque classe, c'est encombrant et produit du code réutilisable.
Voici donc une méthode d'extension qui produit une nouvelle IEqualityComparer à la volée pour toutes les classes à l'aide de la réflexion.
Utilisation:
Méthode D'Extension De Code
Vous ne pouvez pas utiliser efficacement
Distinct
sur une collection d'objets (sans travail supplémentaire). Je vais vous expliquer pourquoi.La documentation dit:
Pour les objets qui signifie qu'il utilise la valeur par défaut de l'équation de la méthode pour comparer des objets (source). C'est sur leur code de hachage. Et puisque les objets ne pas mettre en œuvre la
GetHashCode()
etEquals
méthodes, il vérifiera la référence de l'objet, qui ne sont pas distincts.Une autre façon de faire la même chose...
Il est possible de créer une méthode d'extension pour ce faire, en plus de façon générique. Il serait intéressant si quelqu'un pouvait evalute les performances de cette "DistinctBy" contre le GroupBy approche.
Select
serait un O(n*m) de l'opération, pour que ne soient pas à l'échelle. Il pourrait mieux fonctionner si il y a beaucoup de doublons, c'est à dire si le résultat de la premièreSelect
est une très petite partie de la collection d'origine.Vous pouvez consulter ma PowerfulExtensions de la bibliothèque. Actuellement il est dans un stade très jeune, mais déjà, vous pouvez utiliser des méthodes comme Distinctes, Union, Intersection, Sauf sur un certain nombre de propriétés;
C'est la façon dont vous l'utiliser:
myList.Distinct(x => x.ID)
?