2010-01-06 11 views
3

我宣佈字典obj。如何從C#中的TKey獲取字典TValue?

Dictionary<string, string> aDict = new Dictionary<string, string>(); 
     aDict .Add("IP", "Host"); 

正如我想起,

aDict[IP]表達可以返回該值(主機)。

現在,如果我走向相反的方向。

如何從價值中獲得鑰匙? aDict[Host]

字典是C#中的單向街道,只能從關鍵值運行?謝謝。

回答

19

詞典不會像這樣工作,他們也不打算這樣做。你將如何解決以下:

key = "1", value = "x", 
key = "2", value = "x" 

你可以這樣做:

var keys = dict.Where(kvp => kvp.Value == someValue).Select(kvp => kvp.Key); 
foreach(var key in keys) { 
    Console.WriteLine(key); 
} 

但如果你真的需要去來回按鍵之間的和值,你應該考慮封裝問題轉換成兩方式地圖。這裏是一個非常簡單的實現這個,你可以定製你的需求:

class TwoWayDictionary<TLeft, TRight> { 
    IDictionary<TLeft, TRight> leftToRight = new Dictionary<TLeft, TRight>(); 
    IDictionary<TRight, TLeft> rightToLeft = new Dictionary<TRight, TLeft>(); 

    public void Add(TLeft left, TRight right) { 
     if (leftToRight.ContainsKey(left)) { 
      throw new InvalidOperationException("key left is duplicate"); 
     } 
     if (rightToLeft.ContainsKey(right)) { 
      throw new InvalidOperationException("key right is duplicate"); 
     } 
     leftToRight.Add(left, right); 
     rightToLeft.Add(right, left); 
    } 

    public bool TryGetRightByLeft(TLeft left, out TRight right) { 
     return leftToRight.TryGetValue(left, out right); 
    } 

    public bool TryGetLeftByRight(out TLeft left, TRight right) { 
     return rightToLeft.TryGetValue(right, out left); 
    } 
} 

注意,這個假設沒有關鍵是不斷重複的。

現在,你可以說:

TwoWayDictionary<string, string> dict = new TwoWayDictionary<string, string>(); 
dict.Add("127.0.0.1", "localhost"); 

string host; 
dict.TryGetRightByLeft("127.0.0.1", out host); 
// host is "localhost" 

string ip; 
dict.TryGetLeftByRight("localhost", out ip); 
// ip is "127.0.0.1" 
+0

這真的很酷。 – 2010-01-06 04:12:38

3

字典是單向查找。如果需要,仍然可以循環查找「主機」值的詞典中的所有條目。如果您預計會做很多事情,您可能只想使用兩個字典並保持它們同步。

1

這是一條單行道。值不應該是唯一的,所以你不能按值查找的關鍵,除了通過枚舉整個詞典:

foreach(string s in Dict.Keys) 
{ 
    if(Dict[s] == TheValue) 
     ;//we found it! 
} 
1

是的,字典基本上是單向的。例如,許多密鑰有可能具有「主機」的值,所以沒有簡單的反向查找。

但是,您可以遍歷字典注意哪些鍵映射到所需的值:

foreach (var entry in dict) 
{ 
    if (entry.Value == desiredValue) 
    found.Add(entry.Key); 
} 

顯然,這不是有效的爲大型辭書雖然。

相關問題