Distinctes dans LINQ avec les types anonymes (dans VB.NET)
En supposant que le référencés List
ci-dessous contient 2 éléments:
Dim Countries = From c In List _
Select New With { .Country = c.Country, .CountryID = c.CountryID }
le code ci-dessus renvoie
.Country=Spain .CountryID = 1
.Country=Spain .CountryID = 1
Comment puis-je obtenir les valeurs distinctes? Le Countries
requête doit contenir uniquement
.Country=Spain .CountryID = 1
Ceci s'est avéré être une question intéressante Chocol8.
OriginalL'auteur OrElse | 2011-07-02
Vous devez vous connecter pour publier un commentaire.
Je ne peux que supposer que vous êtes ensemble mort sur l'utilisation de type anonyme que la réponse donnée par Alex Peck est correct. (et j'ai upvoted).
Cependant, cela se résume à un VB.NET vs compilateur C# discussion.
Dans VB.NET lorsqu'un type anonyme est rencontré uniquement les propriétés déclarées comme clé de propriétés peuvent être utilisées à des fins de comparaison. Donc, en VB.NET sans clé, lorsque vous tentez de faire un distinctes de comparaison, rien ne se produira.
Lire tout ça ici.
Donc d'abord, pour répondre à votre question, cela fonctionne avec les types anonymes:
C'est pourquoi freedompeace la réponse n'a pas assez de travail.
C#, cependant, le compilateur est un peu différent.
Quand un type anonyme est rencontrées et une opération de comparaison est nécessaire que le compilateur c# remplace d'égal à Égal et GetHashCode. Il va itérer sur toutes les propriétés publiques de l'anonyme de type pour calculer le hachage de l'objet code pour tester l'égalité.
Et vous pouvez lire plus à ce sujet ici.
Espère que cela répond à votre question.
C'est Génial! Merci!
Remarque importante à partir de la article MSDN: > Les propriétés d'un type anonyme est créé par une requête sont toujours des propriétés de clé. Voir aussi ce cas de test.
OriginalL'auteur Khepri
Cela fonctionne pour moi, quand j'ai arrêter sur la dernière ligne dans le débogueur:
OriginalL'auteur Alex Peck
Distinct doit savoir quelque sorte, dont les objets sont les mêmes. Vous sélectionnez anonymus objets ici, il ne sait pas qui sont les mêmes. Je n'ai jamais écrit une seule ligne de VB.Net mais j'ai essayé quelque chose, et ça fonctionne:
Dans votre cas:
OriginalL'auteur Peter Porfy
Il y a les opérateurs LINQ nommé Distinct(), que vous pouvez appeler de la sorte:
Plus d'informations sur Distincts ici
OriginalL'auteur Diana Ionita
OriginalL'auteur foxy