6

ResourceDictionary を使用していますが、他の項目で値またはキーを検索できるようにしたいと考えています。それぞれが常に一意であるため、問題はありません。この両面ルックアップ機能を持つタイプはありますか?

4

2 に答える 2

7

組み込みではありませんが、これは非常に簡単に記述できます。私はおそらくこれのために 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];
  }


}
于 2008-11-18T19:41:12.307 に答える
2

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

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

私自身の個人的なコード ライブラリ (十分に近い 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 マッピングの一部が失われるリスクがあります。ユニークです。


編集:

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

于 2008-11-18T20:24:35.170 に答える