Что можно использовать в качестве двустороннего словаря ресурсов?
-
08-07-2019 - |
Вопрос
Я использую ResourceDictionary, но мне хотелось бы иметь возможность искать значение или ключ с другим элементом.Каждый из них всегда уникален, так что это не проблема.Есть ли тип, который имеет функцию двустороннего поиска?
Решение
Не встроено, но это довольно легко написать. Я бы, вероятно, реализовал IDictionary для этого, хотя ... Затем вы бы сбросили ResourceDictionary в ваш пользовательский тип.
public class DoubleLookup<TKey, TValue>
{
private IDictionary<TKey, TValue> keys;
private IDictionary<TValue, TKey> values;
//stuff...
public void Add(TKey key, TValue value)
{
this.keys.Add(key, value);
this.values.Add(value, key);
}
public TKey GetKeyFromValue(TValue value)
{
return this.values[value];
}
public TValue GetValueFromKey(TKey key)
{
return this.keys[key];
}
}
Другие советы
Будьте очень осторожны при изменении отношения ключ/значение в словаре.
Контракт словаря гарантирует, что для каждого значения в коллекции существует ровно один ключ, который соответствует этому значению.Ключи уникальны.Но обратное неверно;для каждого отдельного значения может быть много разных ключей, сопоставленных с этим значением.
В моей личной библиотеке кода (написанной на Java, что достаточно близко) у меня есть класс MultiMap именно для таких вещей.Хотя ключи уникальны, каждый ключ может быть связан с несколькими значениями.Это точно идентично Map>.
Когда мне нужно выполнить поиск по ключу в коллекции, я делаю что-то вроде этого:
Map<K, V> lookupTable = ...;
MultiMap<V, K> reverseLookupTable = MapUtil.invert(lookupTable);
V value = ...;
if (reverseLookupTable.containsKey(value)) {
Set<K> keys = reverseLookupTable.get(value);
}
Если вы используете что-то отличное от MultiMap (например, HashMap или Dictionary) в качестве таблицы обратного просмотра, вы рискуете потерять некоторые из ваших сопоставлений V->K, если только вы не можете гарантировать, что все ключи И все значения в вашей коллекции уникальны.
РЕДАКТИРОВАТЬ:
Упс.Я только что заметил, что вы сказали, что все ключи и значения в вашей коллекции уникальны.Но я все равно оставлю свой ответ здесь в качестве предупреждения для других, читающих это, которые, возможно, не смогут предоставить такую же гарантию.