Контейнер .NET для двусторонней конвертации данных? - PullRequest
0 голосов
/ 30 ноября 2009

У меня есть конверсионные таблицы, которые нужно хранить в памяти для быстрого доступа. До сих пор я использовал простой Hashtable, где Ключ был внутренним кодом, а Значение было объектом, содержащим внешний код и другие метаданные.

Теперь нам нужно выполнить обратный поиск, то есть получить внутренний код на основе внешнего кода. Я мог только придумать следующие варианты:

  1. Иметь другой контейнер для этого поиска, Hashtable, содержащий только внутренний код в качестве значения для предотвращения большей избыточности.
  2. Используйте тот же контейнер, который я сейчас использую, и теперь снова сохраните эти объекты, используя внешний код в качестве ключа (с префиксом для предотвращения столкновений).
  3. Не извлекайте данные с помощью ключей, а просматривайте значения, содержащиеся в том же контейнере, чтобы найти запрошенный объект (O (n), такое же использование памяти).

Контейнер загружается отложенным образом, поэтому опции 1 и 2 обычно не работают в худшем случае.

Кто-нибудь думает? Пожалуйста, скажите мне, что есть какой-то эффективный контейнер, который я мог бы использовать для этого, который я пропустил!

* РЕДАКТИРОВАТЬ *

Будучи фреймворком GC и принимая тот факт, что мне нужно иметь два массива преобразования (словари), следующие строки кода фактически означают, что я сохранил только один объект в памяти, а затем два указателя для него под двумя разными хэш-ячейками?

Dictionary<K1,V> forward;
Dictionary<K2,V> reverse;
//...    
void Add(V myObject)
{
    // myObject being the BLL object
    forward.Add(myObject.InternalCode, myObject);
    reverse.Add(myObject.ExternalCode, myObject);
}

Итамар.

Ответы [ 2 ]

1 голос
/ 30 ноября 2009

Создайте собственный класс коллекции, который имеет две внутренние хеш-таблицы (Dictionarys), по одной в каждом направлении.

  public BiHashTable<K, V>
  {
     private Dictionary<K, V> vals = new Dictionary<K, V>();
     private Dictionary<V, K> keys = new Dictionary<V, K>();
     public void Add(K key, V val)
     {
        vals.Add(key, val);
        keys.Add(val, key);
     }
     public K this[v val] { get { return keys[val]; } }
     public V this[K key] { get { return vals[key]; } }
     // etc... 
  }

ПРИМЕЧАНИЕ: это будет проблематично, если K и V одного типа, вам нужна другая формулировка, чем ...

0 голосов
/ 30 ноября 2009

Я скорее использую два экземпляра Dictionary<TKey, TValue>

Способствует удобочитаемости кода

Вы уверены, что этот словарь является узким местом в производительности?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...