Pregunta

Estoy usando un ResourceDictionary, pero me gustaría poder buscar el valor o la clave con el otro elemento. Cada uno es siempre único, por lo que no es un problema. ¿Hay algún tipo que tenga esta función de búsqueda de doble cara?

¿Fue útil?

Solución

No está integrado, pero es bastante fácil de escribir. Sin embargo, probablemente implementaría IDictionary para esto ... Luego volcarías el ResourceDictionary en tu 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];
  }


}

Otros consejos

Tenga mucho cuidado al invertir la relación clave / valor en un diccionario.

El contrato del diccionario garantiza que, para cada valor de la colección, hay exactamente una clave que se asigna a ese valor. Las llaves son únicas. Pero lo contrario no es cierto; para cada valor distinto, puede haber muchas claves diferentes asignadas a ese valor.

En mi propia biblioteca de códigos personales (escrita en Java, que está lo suficientemente cerca), tengo la clase MultiMap para este tipo de cosas. Aunque las claves son únicas, cada clave puede asociarse con múltiples valores. Es exactamente idéntico a un Mapa > ;.

Cuando necesito realizar búsquedas de valor a clave en una colección, hago algo como esto:

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

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

Si usa algo más que un MultiMap (como un HashMap o un Diccionario) como su tabla de búsqueda inversa, corre el riesgo de perder algunas de sus asignaciones de V- > K, a menos que pueda garantizar que todas las claves Y todas los valores en su colección son únicos.


EDITAR:

¡Vaya! Acabo de notar que dijiste que todas las claves y valores de tu colección son únicos. Pero dejaré mi respuesta aquí de todos modos, como una advertencia para otros que lean esto, que tal vez no puedan proporcionar la misma garantía.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top