J'ai donc une collection d'objets. Le type exact n'est pas important. À partir de là, je veux extraire toutes les paires uniques d'une paire de propriétés particulières, ainsi:
myObjectCollection.Select(item=>new
{
Alpha = item.propOne,
Bravo = item.propTwo
}
).Distinct();
Donc ma question est: Will Distinct dans ce cas utilisera l'objet par défaut equals (ce qui me sera inutile, puisque chaque objet est nouveau) ou peut-on lui dire de faire un égal différent (dans ce cas, des valeurs égales d'Alpha et Bravo => instances égales)? Y a-t-il un moyen d'atteindre ce résultat, si cela ne le fait pas?
Réponses:
Lisez ici l'excellent article de K. Scott Allen:
Et l'égalité pour tous ... les types anonymes
La réponse courte (et je cite):
Il est donc totalement sûr d'utiliser la méthode Distinct () sur une requête qui renvoie des types anonymes.
la source
Désolé pour le formatage gâché plus tôt
la source
object
etobject
. Si les deuxobject
sont,string
il renvoie toujours les lignes en double. Essayez leFirstName
typeobject
et attribuez-y le mêmestring
.Intéressant que cela fonctionne en C # mais pas en VB
Renvoie les 26 lettres:
Renvoie 52 ...
la source
Key
mot - clé au type anonyme,.Distinct()
cela fonctionnera comme prévu (par exempleNew With { Key .lower = x.ToString.ToLower(), Key .upper = x.ToString.ToUpper()}
).new {A = b}
estNew {Key .A = b}
. Les propriétés non clés des classes VB anonymes sont modifiables, c'est pourquoi elles sont comparées par référence. En C #, toutes les propriétés des classes anonymes sont immuables.J'ai fait un petit test et j'ai trouvé que si les propriétés sont des types de valeur, cela semble fonctionner correctement. S'il ne s'agit pas de types valeur, le type doit fournir ses propres implémentations Equals et GetHashCode pour que cela fonctionne. Les cordes, je pense, fonctionneraient.
la source
Vous pouvez créer votre propre méthode d'extension distincte qui prend une expression lambda. Voici un exemple
Créer une classe qui dérive de l'interface IEqualityComparer
Ensuite, créez votre méthode d'extension distincte
et vous pouvez utiliser cette méthode pour trouver des éléments distincts
la source
object
etobject
. Si les deuxobject
sont,string
il renvoie toujours les lignes en double. Essayez leFirstName
typeobject
et attribuez-y le mêmestring
.Si
Alpha
et lesBravo
deux héritent d'une classe commune, vous pourrez dicter le contrôle d'égalité dans la classe parente en implémentantIEquatable<T>
.Par exemple:
la source
Hé là, j'ai le même problème et j'ai trouvé une solution. Vous devez implémenter l'interface IEquatable ou simplement remplacer les méthodes (Equals & GetHashCode). Mais ce n'est pas l'astuce, l'astuce venant de la méthode GetHashCode. Vous ne devez pas renvoyer le code de hachage de l'objet de votre classe mais vous devez renvoyer le hachage de la propriété que vous souhaitez comparer comme ça.
Comme vous le voyez, j'ai obtenu une classe appelée personne a 3 propriétés (nom, âge, IsEgyptian "Parce que je suis") Dans le GetHashCode, j'ai renvoyé le hachage de la propriété Name et non l'objet Person.
Essayez-le et cela fonctionnera ISA. Merci, Modather Sadik
la source
public override int GetHashCode() { return this.Name.GetHashCode() ^ this.Age.GetHashCode() ^ this.IsEgyptian.GetHashCode(); }
Pour que cela fonctionne dans VB.NET, vous devez spécifier le
Key
mot - clé avant chaque propriété du type anonyme, comme ceci:J'avais du mal avec cela, je pensais que VB.NET ne supportait pas ce type de fonctionnalité, mais en fait, c'est le cas.
la source