ResourceDictionary を使用していますが、他の項目で値またはキーを検索できるようにしたいと考えています。それぞれが常に一意であるため、問題はありません。この両面ルックアップ機能を持つタイプはありますか?
2 に答える
組み込みではありませんが、これは非常に簡単に記述できます。私はおそらくこれのために 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> とまったく同じです。
コレクションで値からキーへのルックアップを実行する必要がある場合は、次のようにします。
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 マッピングの一部が失われるリスクがあります。ユニークです。
編集:
おっとっと。コレクション内のすべてのキーと値は一意であるとのことでした。しかし、同じ保証を提供できない可能性がある、これを読んでいる他の人への警告として、とにかくここに私の答えを残しておきます。