Gibt es eine Sammlung in C #, mit der Sie keine doppelten Elemente hinzufügen können? Zum Beispiel mit der dummen Klasse von
public class Customer {
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public override int GetHashCode() {
return (FirstName + LastName + Address).GetHashCode();
}
public override bool Equals(object obj) {
Customer C = obj as Customer;
return C != null && String.Equals(this.FirstName, C.FirstName) && String.Equals(this.LastName, C.LastName) && String.Equals(this.Address, C.Address);
}
}
Der folgende Code löst (offensichtlich) eine Ausnahme aus:
Customer Adam = new Customer { Address = "A", FirstName = "Adam", LastName = "" };
Customer AdamDup = new Customer { Address = "A", FirstName = "Adam", LastName = "" };
Dictionary<Customer, bool> CustomerHash = new Dictionary<Customer, bool>();
CustomerHash.Add(Adam, true);
CustomerHash.Add(AdamDup, true);
Aber gibt es eine Klasse, die ebenfalls die Einzigartigkeit garantiert, jedoch ohne KeyValuePairs? Ich dachte, ich HashSet<T>
würde das tun, aber nachdem ich die Dokumente gelesen habe, scheint es, dass die Klasse nur eine festgelegte Implementierung ist ( siehe Abbildung ).
HashSet<T>
. MSDN sagt: "Die HashSet <T> -Klasse bietet leistungsstarke Mengenoperationen. Eine Menge ist eine Sammlung, die keine doppelten Elemente enthält und deren Elemente in keiner bestimmten Reihenfolge sind."HashSet<T>
nicht ausreicht?Dictionary<K,V>
Klasse nicht garantieren , jede Art von Ordnung.HashSet<T>.Add
false
Antworten:
HashSet<T>
ist was du suchst. Von MSDN (Hervorhebung hinzugefügt):Beachten Sie, dass die
HashSet<T>.Add(T item)
Methode abool
- zurückgibt,true
wenn das Element zur Sammlung hinzugefügt wurde.false
wenn der Artikel bereits vorhanden war.quelle
IEquatable
können Sie auch eine (benutzerdefinierte) Implementierung derEqualityComparer<T>
Instanz an denHashSet<T>
Konstruktor übergeben.Wie wäre es nur mit einer Erweiterungsmethode in HashSet?
quelle
Von der
HashSet<T>
Seite auf MSDN:(Hervorhebung von mir)
quelle
Wenn Sie lediglich die Eindeutigkeit von Elementen sicherstellen möchten, ist HashSet genau das Richtige für Sie.
Was meinst du mit "nur eine festgelegte Implementierung"? Eine Menge ist (per Definition) eine Sammlung eindeutiger Elemente, die die Elementreihenfolge nicht speichert.
quelle
Du kannst es versuchen
HashSet<T>
quelle
Nur um meine 2 Cent hinzuzufügen ...
Wenn Sie eine ValueExistingException-Auslösung benötigen, können
HashSet<T>
Sie Ihre Sammlung auch einfach erstellen:Dies kann zum Beispiel nützlich sein, wenn Sie es an vielen Orten benötigen ...
quelle
Sie können wie folgt in eine Art eindeutige Liste schauen
und Sie können es wie folgt verwenden
wird nur
"abc","def","ghi","jkl","mno"
immer zurückgegeben, auch wenn Duplikate hinzugefügt werdenquelle