Что можно использовать в качестве двустороннего словаря ресурсов?

StackOverflow https://stackoverflow.com/questions/299869

  •  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, если только вы не можете гарантировать, что все ключи И все значения в вашей коллекции уникальны.


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

Упс.Я только что заметил, что вы сказали, что все ключи и значения в вашей коллекции уникальны.Но я все равно оставлю свой ответ здесь в качестве предупреждения для других, читающих это, которые, возможно, не смогут предоставить такую ​​​​же гарантию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top