Um besser als O (n) zu werden, müssen Sie ein 2. Wörterbuch verwenden. Wie Sie bereits erwähnt haben, verwenden Sie Strukturen und sind besorgt über die Speichernutzung mit einem zweiten Wörterbuch mit einer doppelten Kopie der Struktur.
Um dies zu erreichen, geben Sie den Strukturwert in einem Objekt ein und teilen Sie dann das eingerahmte Objekt in den beiden Wörterbüchern. Wenn Sie von DictionaryBase
erben, ist das eigentlich ziemlich einfach zu implementieren.
public sealed class TwoWayDictionary<TKey, TValue> : DictionaryBase
{
Hashtable reverseLookup = new Hashtable();
public void Add(TKey key, TValue value)
{
this.Dictionary.Add(key, value);
}
public void Remove(TKey key)
{
this.Dictionary.Remove(key);
}
public bool TryGetValue(TKey key, out TValue value)
{
object lookup = Dictionary[key];
if (lookup == null)
{
value = default(TValue);
return false;
}
else
{
value = (TValue)lookup;
return true;
}
}
public bool TryGetKey(TValue value, out TKey key)
{
object lookup = reverseLookup[value];
if (lookup == null)
{
key = default(TKey);
return false;
}
else
{
key = (TKey)lookup;
return true;
}
}
//If OnInsertComplete or OnSetComplete raises a exception DictionaryBase will
// roll back the operation it completed.
protected override void OnInsertComplete(object key, object value)
{
reverseLookup.Add(value, key);
}
protected override void OnSetComplete(object key, object oldValue, object newValue)
{
if(reverseLookup.Contains(newValue))
throw new InvalidOperationException("Duplicate value");
if(oldValue != null)
reverseLookup.Remove(oldValue);
reverseLookup[newValue] = key;
}
protected override void OnRemoveComplete(object key, object value)
{
reverseLookup.Remove(value);
}
}
Die Dictionary
und reverseLookup
Wörterbücher werden die gleichen Referenzen teilen, so dass es einen kleineren Speicherbedarf als die Verwendung von zwei stark typisierten Wörterbücher mit großen Strukturen haben.
Ohne eine vollständige Dictionary<TKey, TValue>
Implementierung zu schreiben, die zwei interne Bucket-Sammlungen für Schlüssel und Werte und zwei verknüpfte Listen für die Ketten aus den Buckets verwendet, glaube ich nicht, dass Sie viel bessere Ergebnisse erhalten können.
"ohne Duplizierung des Speichers (also zwei Wörterbücher sind nicht in Frage)." Wenn Sie zwei Wörterbücher verwenden, wird der Arbeitsspeicher nicht dupliziert, es sei denn, Ihre 'TKey' und' TValue' sind beide Strukturen. –
@ScottChamberlain sie sind beide Strukturen :) –
Ich weiß nicht, ob das, was Sie fragen, möglich ist. Ich meine, ich weiß nicht viel und habe noch viel zu lernen, aber eine Sache, die ich immer über Computerwissenschaften gehört habe, ist: "Du willst es schnell? Du brauchst Gedächtnis. Du willst es Licht? Es wird langsamer sein." Aber ich bevorzuge deine Frage, weil ich intressed bin. –