Aby uzyskać lepsze wyniki niż O (n), należy użyć drugiego słownika. Jednak, jak wspomniałeś, używasz struktur i martwisz się wykorzystaniem pamięci przez drugi słownik mający duplikat struktury.
Jednym sposobem obejścia tego pola jest umieszczenie wartości struct wewnątrz obiektu, a następnie udostępnienie obiektu w pudełku w dwóch słownikach. Jeśli używasz dziedziczenia z DictionaryBase
, jest to całkiem łatwe do wdrożenia.
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);
}
}
W Dictionary
i reverseLookup
słowniki będą dzielić te same referencje, więc będzie mieć mniejsze zużycie pamięci niż przy użyciu dwóch silnie wpisane słowniki z dużych strukturach.
Bez pisania pełnej implementacji Dictionary<TKey, TValue>
, która wykorzystuje dwa wewnętrzne zbiory kubełków dla kluczy i wartości oraz dwie połączone listy dla łańcuchów poza segmentami Nie sądzę, że można uzyskać znacznie lepsze wyniki.
"bez duplikowania pamięci (dlatego dwa słowniki są wykluczone)." używanie dwóch słowników nie powoduje duplikacji pamięci, chyba że twoje "TKey" i "TValue" są strukturami. –
@ScottChamberlain oba są strukturami :) –
Nie wiem, czy to, o co prosisz, jest możliwe. Mam na myśli to, że nie wiem zbyt wiele i wciąż muszę się wiele nauczyć, ale jedną rzecz, którą zawsze słyszałam o informatyce, jest: "Chcesz tego szybko? Potrzebujesz pamięci, chcesz jej światło? Będzie wolniej". Ale popieram twoje pytanie, odkąd jestem zaintrygowany. –