Domanda

Sto usando un ResourceDictionary, ma vorrei essere in grado di cercare il valore o la chiave con l'altro elemento. Ognuno è sempre unico, quindi non è un problema. Esiste un tipo con questa funzione di ricerca fronte-retro?

È stato utile?

Soluzione

Non integrato, ma è abbastanza facile da scrivere. Probabilmente implementerei IDictionary per questo però ... Dovresti quindi scaricare ResourceDictionary nel tuo tipo personalizzato.

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


}

Altri suggerimenti

Prestare molta attenzione quando si inverte la relazione chiave / valore in un dizionario.

Il contratto del dizionario garantisce che, per ogni valore nella raccolta, esiste esattamente una chiave che corrisponde a quel valore. Le chiavi sono uniche. Ma non è vero il contrario; per ogni valore distinto, possono esserci molte chiavi diverse che si associano a quel valore.

Nella mia libreria di codici personali (scritta in Java, che è abbastanza vicina), ho una classe MultiMap proprio per questo tipo di cose. Sebbene le chiavi siano univoche, ogni chiave può essere associata a più valori. È esattamente identico a una mappa > ;.

Quando devo eseguire ricerche value-to-key in una raccolta, faccio qualcosa del genere:

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

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

Se usi qualcosa di diverso da una MultiMap (come una HashMap o un Dizionario) come tabella di ricerca inversa, corri il rischio di perdere parte dei tuoi mapping V- > K, a meno che tu non possa garantire che tutte le chiavi E tutti i valori nella tua raccolta sono unici.


EDIT:

Spiacenti. Ho appena notato che hai detto che tutte le chiavi e i valori nella tua raccolta sono unici. Lascio comunque la mia risposta qui, come avvertimento per gli altri che leggono questo, che potrebbero non essere in grado di fornire la stessa garanzia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top