LINQ Select Distinct avec les Types Anonymes
J'ai donc une collection d'objets. Le type exact n'est pas important. De il je veux extraire toutes les paires dans une paire de propriétés particulières, comme ceci:
myObjectCollection.Select(item=>new
{
Alpha = item.propOne,
Bravo = item.propTwo
}
).Distinct();
Donc ma question est: Va Distinctes dans ce cas, utilisez la valeur par défaut de l'objet est égale à (ce qui sera inutile pour moi, car chaque objet est nouveau) ou peut-il être dit de faire un autre equals (dans ce cas, l'égalité des valeurs d'Alpha et Bravo => l'égalité des instances)? Est-il un moyen pour parvenir à ce résultat, si ce n'est pas cela?
- Est-ce LINQ-to-Objets ou LINQ-to-SQL? Si seulement les objets, vous êtes probablement hors de la chance. Toutefois, si L2S, alors ça peut fonctionner, comme les différents serait passé sur l'instruction SQL.
Vous devez vous connecter pour publier un commentaire.
Lisez K. Scott Allen excellent post ici:
Et de l'Égalité pour Tous les Types Anonymes ...
La réponse courte (et je cite):
Donc il est totalement sûr à utiliser la méthode Distinct() sur une requête qui renvoie les types anonymes.
Désolé pour les foiré mise en forme plus tôt
object
etobject
. Si les deuxobject
eststring
il toujours retourner les lignes en double. Essayez leFirstName
est typeofobject
et d'attribuer à la mêmestring
là.Intéressante qu'elle travaille en C# mais pas en VB
Retourne le 26 lettres:
Retourne 52...
Key
mot-clé le type anonyme le.Distinct()
fonctionnera comme prévu (par exemple,New With { Key .lower = x.ToString.ToLower(), Key .upper = x.ToString.ToUpper()}
).new {A = b}
estNew {Key .A = b}
. Non-principales propriétés en anonyme VB classes sont mutables, c'est pourquoi ils sont comparés par référence. En C#, toutes les propriétés de classes anonymes sont immuables.J'ai couru un petit test, et a constaté que si les propriétés sont les types de valeur, il semble bien fonctionner. Si elles ne sont pas de types de valeur, alors le type doit fournir ses propres Égaux et GetHashCode implémentations pour que cela fonctionne. Cordes, je pense, serait de travailler.
Vous pouvez créer votre propre méthode d'Extension qui prend expression lambda. Voici un exemple
Créer une classe qui dérive de IEqualityComparer interface
Ensuite créer votre Distincte de la méthode d'Extension
et vous pouvez utiliser cette méthode de trouver des articles distincts
object
etobject
. Si les deuxobject
eststring
il toujours retourner les lignes en double. Essayez leFirstName
est typeofobject
et d'attribuer à la mêmestring
là.Si
Alpha
etBravo
les deux hériter d'une classe commune, vous serez en mesure de dicter le contrôle d'égalité dans la classe parente par la mise en œuvre deIEquatable<T>
.Par exemple:
Hé là, j'ai eu le même problème et j'ai trouvé une solution.
Vous devez mettre en œuvre la IEquatable interface ou tout simplement remplacer la
(Est égal à & GetHashCode) Méthodes. Mais ce n'est pas le truc, le truc venir dans la Méthode GetHashCode. Vous ne devriez pas retourner le code de hachage de l'objet de votre classe, mais vous devez retourner la valeur de hachage de la propriété que vous souhaitez comparer comme ça.
Comme vous le voyez, j'ai eu une classe de la personne appelée a obtenu 3 propriétés (Nom,prénom, Âge,IsEgyptian"Parce que je suis") Dans la GetHashCode je retourne le hash du Nom de la propriété qui n'est pas l'objet de Personne.
L'essayer et il fonctionnera ISA.
Merci,
Modather Sadik
public override int GetHashCode() { return this.Name.GetHashCode() ^ this.Age.GetHashCode() ^ this.IsEgyptian.GetHashCode(); }
Pour travailler dans VB.NET, vous devez spécifier le
Key
mot-clé avant chaque propriété dans le type anonyme, juste comme ça:J'ai eu du mal avec cela, je pensais que VB.NET ne prend pas en charge ce type de fonctionnalité, mais en réalité, il n'.