Gibt es Wörterbuchklassen in der .NET-Basisklassenbibliothek, mit denen doppelte Schlüssel verwendet werden können? Die einzige Lösung, die ich gefunden habe, besteht darin, beispielsweise eine Klasse wie die folgende zu erstellen:
Dictionary<string, List<object>>
Aber es ist ziemlich irritierend, es tatsächlich zu benutzen. Ich glaube, dass eine MultiMap in Java dies erreicht, aber in .NET kein Analogon finden kann.
c#
.net
dictionary
multimap
Mechanische Schnecke
quelle
quelle
{ a, 1 }
und{ a, 2 }
in einer Hash-Tabelle speichern müssen, ina
der sich der Schlüssel befindet, ist eine Alternative zu haben{ a, [1, 2] }
.Antworten:
Wenn Sie .NET 3.5 verwenden, verwenden Sie die
Lookup
Klasse.BEARBEITEN: Sie erstellen in der Regel eine
Lookup
VerwendungEnumerable.ToLookup
. Dies setzt voraus, dass Sie es später nicht mehr ändern müssen - aber ich finde das normalerweise gut genug.Wenn das bei Ihnen nicht funktioniert, gibt es meiner Meinung nach nichts im Framework, das helfen könnte - und die Verwendung des Wörterbuchs ist so gut wie es nur geht :(
quelle
Lookup
ist nicht serialisierbarDie List-Klasse eignet sich recht gut für Schlüssel- / Wertsammlungen mit Duplikaten, bei denen Sie die Sammlung durchlaufen möchten. Beispiel:
quelle
Hier ist eine Möglichkeit, dies mit List <KeyValuePair <string, string >> zu tun
Ausgänge k1 = v1, k1 = v2, k1 = v3
quelle
Wenn Sie Zeichenfolgen sowohl als Schlüssel als auch als Werte verwenden, können Sie System.Collections.Specialized.NameValueCollection verwenden , das über die GetValues-Methode (Zeichenfolgenschlüssel) ein Array von Zeichenfolgenwerten zurückgibt.
quelle
Ich bin gerade auf die PowerCollections- Bibliothek gestoßen, die unter anderem eine Klasse namens MultiDictionary enthält. Dies schließt diese Art von Funktionalität ordentlich ein.
quelle
Sehr wichtiger Hinweis zur Verwendung von Lookup:
Sie können eine Instanz von erstellen,
Lookup(TKey, TElement)
indem SieToLookup
ein Objekt aufrufen , das implementiert wirdIEnumerable(T)
Es gibt keinen öffentlichen Konstruktor zum Erstellen einer neuen Instanz von a
Lookup(TKey, TElement)
. Darüber hinaus sindLookup(TKey, TElement)
Objekte unveränderlich, dh Sie können keine Elemente oder Schlüssel zu a hinzufügen oder daraus entfernenLookup(TKey, TElement)
Objekt nach seiner .(von MSDN)
Ich würde denken, dass dies ein Show-Stopper für die meisten Anwendungen wäre.
quelle
Ich denke, so etwas
List<KeyValuePair<object, object>>
würde den Job machen.quelle
Wenn Sie> = .NET 4 verwenden, können Sie
Tuple
Class verwenden:quelle
List<KeyValuePair<key, value>>
Lösung wie oben aus. Liege ich falsch?Es ist einfach genug, eine "eigene" Version eines Wörterbuchs zu erstellen, das "doppelte Schlüssel" -Einträge ermöglicht. Hier ist eine grobe einfache Implementierung. Möglicherweise möchten Sie Unterstützung für die meisten (wenn nicht alle) hinzufügen
IDictionary<T>
.Ein kurzes Beispiel für die Verwendung:
quelle
Als Antwort auf die ursprüngliche Frage. So etwas
Dictionary<string, List<object>>
ist in einer Klasse namensMultiMap
The implementiertCode Project
.Weitere Informationen finden Sie unter dem folgenden Link: http://www.codeproject.com/KB/cs/MultiKeyDictionary.aspx
quelle
Die NameValueCollection unterstützt mehrere Zeichenfolgenwerte unter einem Schlüssel (der auch eine Zeichenfolge ist), aber es ist das einzige mir bekannte Beispiel.
Ich neige dazu, Konstrukte ähnlich dem in Ihrem Beispiel zu erstellen, wenn ich auf Situationen stoße, in denen ich diese Art von Funktionalität benötige.
quelle
Bei Verwendung der
List<KeyValuePair<string, object>>
Option verwenden, können Sie die Suche mit LINQ durchführen:quelle
Seit dem neuen C # (ich glaube, es ist von 7.0) können Sie auch so etwas tun:
und Sie verwenden es als Standardliste, aber mit zwei Werten, die wie gewünscht benannt sind
quelle
Meinen Sie kongruent und kein tatsächliches Duplikat? Andernfalls könnte eine Hashtabelle nicht funktionieren.
Kongruent bedeutet, dass zwei separate Schlüssel auf den entsprechenden Wert gehasht werden können, die Schlüssel jedoch nicht gleich sind.
Beispiel: Angenommen, die Hash-Funktion Ihrer Hashtabelle war nur Hashval = Key Mod 3. Sowohl 1 als auch 4 werden 1 zugeordnet, sind jedoch unterschiedliche Werte. Hier kommt Ihre Idee einer Liste ins Spiel.
Wenn Sie nach 1 suchen müssen, wird dieser Wert auf 1 gehasht, und die Liste wird durchlaufen, bis der Schlüssel = 1 gefunden wird.
Wenn Sie das Einfügen doppelter Schlüssel zulassen würden, könnten Sie nicht unterscheiden, welche Schlüssel welchen Werten zugeordnet sind.
quelle
Die Art, wie ich benutze, ist nur eine
Dictionary<string, List<string>>
Auf diese Weise haben Sie einen einzelnen Schlüssel, der eine Liste von Zeichenfolgen enthält.
Beispiel:
quelle
Ich bin auf der Suche nach derselben Antwort über diesen Beitrag gestolpert und habe keine gefunden. Deshalb habe ich eine Beispiellösung mit einer Liste von Wörterbüchern zusammengestellt und den Operator [] überschrieben, um der Liste ein neues Wörterbuch hinzuzufügen, wenn alle anderen eine haben gegebener Schlüssel (gesetzt), und geben Sie eine Liste von Werten zurück (get).
Es ist hässlich und ineffizient, es wird NUR per Schlüssel abgerufen / gesetzt und es gibt immer eine Liste zurück, aber es funktioniert:
quelle
Ich habe die Antwort von @Hector Correa in eine Erweiterung mit generischen Typen geändert und ihr auch einen benutzerdefinierten TryGetValue hinzugefügt.
quelle
Dies ist ein Weg Weg Concurrent Wörterbuch Ich denke, das wird Ihnen helfen:
Beispiele:
quelle
Ich benutze diese einfache Klasse:
Verwendung:
quelle
Sie können Ihren eigenen Wörterbuch-Wrapper erstellen, so etwas wie diesen. Als Bonus unterstützt er den Nullwert als Schlüssel:
Das Verwendungsbeispiel:
quelle
var dictionary = new OpenDictionary<string, int>(); dictionary.Add("1", 1); // The next line won't throw an exception; dictionary.Add("1", 2); dictionary.TryGetEntries("1", out List<int> result); // result is { 1, 2 }
Sie können eine Methode zum Erstellen eines zusammengesetzten Zeichenfolgenschlüssels überall dort definieren, wo Sie ein Wörterbuch verwenden möchten. Sie müssen diese Methode verwenden, um Ihren Schlüssel zu erstellen, zum Beispiel:
zum Benutzen:
quelle
Doppelte Schlüssel brechen den gesamten Vertrag des Wörterbuchs. In einem Wörterbuch ist jeder Schlüssel eindeutig und einem einzelnen Wert zugeordnet. Wenn Sie ein Objekt mit einer beliebigen Anzahl zusätzlicher Objekte verknüpfen möchten, ist die beste Wahl möglicherweise ein DataSet (im allgemeinen Sprachgebrauch eine Tabelle). Tragen Sie Ihre Schlüssel in eine Spalte und Ihre Werte in die andere ein. Dies ist erheblich langsamer als ein Wörterbuch, aber das ist Ihr Kompromiss, wenn Sie die Fähigkeit verlieren, die Schlüsselobjekte zu hashen.
quelle
Auch das ist möglich:
Auf diese Weise können wir eindeutige Schlüssel haben. Hoffe das funktioniert bei dir.
quelle
Sie können dieselben Schlüssel mit unterschiedlichen Groß- und Kleinschreibung hinzufügen, z.
key1
Key1
KEY1
KeY1
kEy1
keY1
Ich weiß, ist eine Scheinantwort, hat aber für mich gearbeitet.
quelle