両面リソースディクショナリとして使用できるものは何ですか?

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


}

他のヒント

ディクショナリ内のキー/値の関係を逆にするときは十分に注意してください。

ディクショナリのコントラクトにより、コレクション内のすべての値に対して、その値にマップされるキーが1つだけ存在することが保証されます。キーは一意です。しかし、その逆は当てはまりません。個別の値ごとに、その値にマッピングされるさまざまなキーが存在する可能性があります。

自分の個人用コードライブラリ(Javaで書かれており、十分に近い)には、この種のことのためのMultiMapクラスがあります。キーは一意ですが、各キーを複数の値に関連付けることができます。 Map&gt;とまったく同じです。

コレクションで値からキーへのルックアップを実行する必要がある場合、次のようにします。

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や辞書など)を使用すると、すべてのキーとすべてコレクション内の値は一意です。


編集:

おっと。コレクション内のすべてのキーと値は一意であると言っていることに気付きました。しかし、これを読んでいる他の人に対する警告として、とにかく私の答えをここに残します。彼らは同じ保証を提供できないかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top