Pergunta

Eu estou usando um ResourceDictionary, mas eu gostaria de ser capaz de olhar para o valor ou a tecla com o outro item. Cada um é sempre única, de modo que não é um problema. Existe um tipo que tem este recurso de pesquisa de dupla face?

Foi útil?

Solução

Não embutido, mas isso é muito fácil de escrever. Eu provavelmente implementar IDictionary para este embora ... Você, então, despejar o ResourceDictionary em seu tipo personalizado.

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];
  }


}

Outras dicas

Tenha muito cuidado ao inverter a relação de chave / valor em um dicionário.

O contrato das garantias de dicionário que, para cada valor na coleção, há exatamente uma chave que mapeia para esse valor. As teclas são únicos. Mas o inverso não é verdadeiro; para cada valor distinto, pode haver muitas chaves diferentes mapeamento para esse valor.

Na minha própria biblioteca de código pessoal (escrito em Java, que é perto o suficiente), eu tenho classe MultiMap apenas para este tipo de coisa. Embora as chaves são únicas, cada tecla pode ser associado a vários valores. É exatamente idêntico a um Mapa>.

Quando eu preciso para executar valor-to-chave pesquisas em uma coleção, eu fazer algo parecido com isto:

Map<K, V> lookupTable = ...;
MultiMap<V, K> reverseLookupTable = MapUtil.invert(lookupTable);

V value = ...;
if (reverseLookupTable.containsKey(value)) {
   Set<K> keys = reverseLookupTable.get(value);
}

Se você usar algo diferente de um MultiMap (como um HashMap ou dicionário) como sua tabela de pesquisa inversa, você corre o risco de perder alguns de seus mapeamentos V-> K, a menos que você pode garantir que todas as chaves e todos os valores em sua coleção são únicos.


EDIT:

Opa. Eu notei que você disse que todas as chaves e valores na sua coleção são únicos. Mas vou deixar a minha resposta aqui de qualquer forma, como um aviso para os outros que lêem este, que pode não ser capaz de fornecer a mesma garantia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top