2008-11-18 48 views
6

我正在使用ResourceDictionary,但我希望能夠查找與其他項目的值或密鑰。每個都是獨一無二的,所以這不是問題。有沒有這種雙面查找功能的類型?什麼可以用作雙面資源字典?

回答

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


} 
2

反轉字典中的鍵/值關係時要非常小心。

字典的合同保證,爲集合中的每一個值,恰好有它映射到該值一個關鍵。鑰匙是獨一無二的。但事實並非如此。對於每個不同的值,可以有許多不同的鍵映射到該值。

在我個人的代碼庫(用Java編寫的,這是足夠接近),我有多重映射類只是這種事情。雖然密鑰是唯一的,但每個密鑰都可以與多個值關聯。它與Map>完全相同。

當我需要一個集合中執行價值與鍵查找,我做這樣的事情:

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

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

如果使用除多重映射爲您的反向東西(比如一個HashMap或詞典)查找表中,除非可以保證集合中的所有鍵和所有值都是唯一的,否則會冒失去一些V-> K映射的風險。


編輯:

哎呀。我只注意到你說你的集合中的所有鍵和值都是唯一的。但是,無論如何,我會在這裏留下我的答案,作爲對其他讀者的警告,可能無法提供相同的保證。