Ich suche eine generische, bidirektionale 1 zu 1 Wörterbuchklasse in C # (2), dh. a, BiDictionaryOneToOne<T, S>
das garantiert nur einen von jedem Wert und Schlüssel enthält (ohnehin bis zu RefEquals) und das entweder mit Schlüssel oder Wert durchsucht werden kann. Kennt jemand eine oder sollte ich sie einfach selbst implementieren? Ich kann nicht glauben, dass ich die erste Person bin, die das braucht ...
Die Antworten auf diese Frage enthalten ein BiDictionary , das jedoch nicht für eindeutige Elemente bestimmt ist (und auch RemoveByFirst (T t) oder RemoveBySecond (S s) nicht implementiert).
Vielen Dank!
c#
.net
collections
Joel in Gö
quelle
quelle
Antworten:
OK, hier ist mein Versuch (auf Jons aufgebaut - danke), hier archiviert und offen für Verbesserungen:
quelle
Eine vollständigere Implementierung des bidirektionalen Wörterbuchs:
Dictionary<TKey,TValue>
(außer Infrastrukturschnittstellen):IDictionary<TKey, TValue>
IReadOnlyDictionary<TKey, TValue>
IDictionary
ICollection<KeyValuePair<TKey, TValue>>
(Diese und die folgenden sind die Basisschnittstellen der oben genannten)ICollection
IReadOnlyCollection<KeyValuePair<TKey, TValue>>
IEnumerable<KeyValuePair<TKey, TValue>>
IEnumerable
SerializableAttribute
.DebuggerDisplayAttribute
(mit Count-Info) undDebuggerTypeProxyAttribute
(zur Anzeige von Schlüssel-Wert-Paaren in Uhren).IDictionary<TValue, TKey> Reverse
Eigenschaft verfügbar und implementiert auch alle oben genannten Schnittstellen. Alle Operationen in beiden Wörterbüchern ändern beide.Verwendung:
Code ist in meinem privaten Framework auf GitHub verfügbar: BiDictionary (TFirst, TSecond) .cs ( Permalink , Suche ).
Kopieren:
quelle
item.Reverse
Zeilen. Besondere Versionsanforderungen?KeyValuePairExts
Klasse am Ende des Code-Snippets nicht kopiert .Die Frage, auf die Sie sich beziehen, zeigt in dieser Antwort auch eine Eins-zu-Eins-Implementierung . Das Hinzufügen von RemoveByFirst und RemoveBySecond wäre trivial - ebenso wie das Implementieren zusätzlicher Schnittstellen usw.
quelle
Dies ist das Gleiche wie die akzeptierte Antwort, aber ich habe auch
Update
Methoden bereitgestellt und insgesamt etwas mehr konkretisiert:Ähnlich wie meine Antwort hier
Einige Dinge zu beachten:
Ich habe nur implementiert
IEnumerable<>
. Ich halteICollection<>
das hier nicht für sinnvoll, da die Methodennamen für diese spezielle Sammlungsstruktur alle sehr unterschiedlich sein können. Es liegt an Ihnen zu entscheiden, was hineingehen sollIEnumerable<>
. Jetzt haben Sie also auch die Syntax für die Initialisierung von SammlungenIch habe versucht, hier und da einige seltsame Ausnahmen auszulösen - nur aus Gründen der Datenintegrität. Nur um auf der sicheren Seite zu sein, damit Sie wissen, ob mein Code jemals Fehler aufweist.
Leistung: Sie können
Value
mit beiden Methoden suchenKeys
, was bedeutet, dass für die MethodeGet
und dieContains
Methode nur eine Suche erforderlich ist (O (1)).Add
erfordert 2 Lookups und 2 Adds.Update
erfordert 1 Suche und 2 fügt hinzu.Remove
dauert 3 Suchvorgänge. Alles ähnlich der akzeptierten Antwort.quelle
IEnumerator<Tuple<TKey1, TKey2>>
hier verwendet. NichtIEnumerator<KeyValuePair<TKey1, TKey2>>
, also denke ich, dass ich das mit meiner GetEnumerator-Funktion nicht machen kann. Habe ich dich richtig verstanden?Ich habe eine solche Klasse mit C5-Auflistungsklassen erstellt.
quelle
Eine weitere Erweiterung der akzeptierten Antwort. Es implementiert IEnumerable, so dass man foreach damit verwenden kann. Mir ist klar, dass es mit der IEnumerable-Implementierung mehr Antworten gibt, aber diese verwendet Strukturen, sodass sie für den Garbage Collector geeignet ist . Dies ist besonders nützlich in der Unity- Engine (mit dem Profiler überprüft).
quelle
Ein bisschen spät, aber hier ist eine Implementierung, die ich vor einiger Zeit geschrieben habe. Es werden einige interessante Randfälle behandelt, z. B. wenn der Schlüssel die Gleichheitsprüfung überschreibt, um eine teilweise Gleichheit durchzuführen. Dies führt dazu, dass das Hauptwörterbuch gespeichert wird,
A => 1
aber umgekehrt1 => A'
.Sie greifen über die
Inverse
Eigenschaft auf das inverse Wörterbuch zu .Originalquelle und Tests auf Github.
quelle