Ich habe also eine Sammlung von Objekten. Der genaue Typ ist nicht wichtig. Daraus möchte ich alle eindeutigen Paare eines Paares bestimmter Eigenschaften extrahieren, also:
myObjectCollection.Select(item=>new
{
Alpha = item.propOne,
Bravo = item.propTwo
}
).Distinct();
Meine Frage lautet also: Wird Distinct in diesem Fall das Standardobjekt gleich verwenden (was für mich nutzlos ist, da jedes Objekt neu ist) oder kann es angewiesen werden, ein anderes Gleichwert zu verwenden (in diesem Fall gleiche Werte von Alpha und Bravo) => gleiche Instanzen)? Gibt es eine Möglichkeit, dieses Ergebnis zu erzielen, wenn dies nicht der Fall ist?
Antworten:
Lesen Sie hier den ausgezeichneten Beitrag von K. Scott Allen durch:
Und Gleichheit für alle ... Anonyme Typen
Die kurze Antwort (und ich zitiere):
Daher ist es absolut sicher, die Distinct () -Methode für eine Abfrage zu verwenden, die anonyme Typen zurückgibt.
quelle
Entschuldigen Sie die fehlerhafte Formatierung früher
quelle
object
und verarbeitenobject
. Wenn beides der Fallobject
iststring
, werden die doppelten Zeilen immer noch zurückgegeben. Probieren Sie denFirstName
is-Typ ausobject
und weisen Sie ihnstring
dort zu.Interessant, dass es in C # funktioniert, aber nicht in VB
Gibt die 26 Buchstaben zurück:
Rückgabe 52 ...
quelle
Key
Schlüsselwort zum anonymen Typ hinzufügen,.Distinct()
funktioniert dies wie beabsichtigt (zNew With { Key .lower = x.ToString.ToLower(), Key .upper = x.ToString.ToUpper()}
. B. ).new {A = b}
lautetNew {Key .A = b}
. Nicht-Schlüsseleigenschaften in anonymen VB-Klassen sind veränderbar, weshalb sie als Referenz verglichen werden. In C # sind alle Eigenschaften anonymer Klassen unveränderlich.Ich habe einen kleinen Test durchgeführt und festgestellt, dass es in Ordnung ist, wenn die Eigenschaften Werttypen sind. Wenn es sich nicht um Werttypen handelt, muss der Typ seine eigenen Equals- und GetHashCode-Implementierungen bereitstellen, damit er funktioniert. Saiten, würde ich denken, würden funktionieren.
quelle
Sie können Ihre eigene Distinct Extension-Methode erstellen, die den Lambda-Ausdruck verwendet. Hier ist ein Beispiel
Erstellen Sie eine Klasse, die von der IEqualityComparer-Schnittstelle abgeleitet ist
Erstellen Sie dann Ihre Distinct Extension-Methode
Mit dieser Methode können Sie verschiedene Elemente finden
quelle
object
und verarbeitenobject
. Wenn beides der Fallobject
iststring
, werden die doppelten Zeilen immer noch zurückgegeben. Probieren Sie denFirstName
is-Typ ausobject
und weisen Sie ihnstring
dort zu.Wenn
Alpha
undBravo
beide von einer gemeinsamen Klasse erben, können Sie die Gleichheitsprüfung in der übergeordneten Klasse durch Implementierung diktierenIEquatable<T>
.Beispielsweise:
quelle
Hey da habe ich das gleiche Problem und ich habe eine Lösung gefunden. Sie müssen die IEquatable-Schnittstelle implementieren oder einfach die (Equals & GetHashCode) -Methoden überschreiben. Dies ist jedoch nicht der Trick, der in der GetHashCode-Methode enthalten ist. Sie sollten nicht den Hash-Code des Objekts Ihrer Klasse zurückgeben, sondern den Hash der Eigenschaft, die Sie so vergleichen möchten.
Wie Sie sehen, habe ich eine Klasse namens Person mit 3 Eigenschaften erhalten (Name, Alter, ägyptisch "Weil ich bin"). Im GetHashCode habe ich den Hash der Eigenschaft Name zurückgegeben, nicht das Objekt Person.
Probieren Sie es aus und es wird ISA funktionieren. Vielen Dank, Modather Sadik
quelle
public override int GetHashCode() { return this.Name.GetHashCode() ^ this.Age.GetHashCode() ^ this.IsEgyptian.GetHashCode(); }
Damit es in VB.NET funktioniert, müssen Sie das
Key
Schlüsselwort vor jeder Eigenschaft im anonymen Typ wie folgt angeben :Ich hatte damit zu kämpfen, ich dachte, VB.NET unterstützt diese Art von Funktion nicht, aber tatsächlich.
quelle