У меня есть конверсионные таблицы, которые нужно хранить в памяти для быстрого доступа. До сих пор я использовал простой Hashtable
, где Ключ был внутренним кодом, а Значение было объектом, содержащим внешний код и другие метаданные.
Теперь нам нужно выполнить обратный поиск, то есть получить внутренний код на основе внешнего кода. Я мог только придумать следующие варианты:
- Иметь другой контейнер для этого поиска, Hashtable, содержащий только внутренний код в качестве значения для предотвращения большей избыточности.
- Используйте тот же контейнер, который я сейчас использую, и теперь снова сохраните эти объекты, используя внешний код в качестве ключа (с префиксом для предотвращения столкновений).
- Не извлекайте данные с помощью ключей, а просматривайте значения, содержащиеся в том же контейнере, чтобы найти запрошенный объект (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);
}
Итамар.