2014-05-09 17 views
1

有沒有有效的方法來檢查值是在字典中知道值是存在然後找到該值的關鍵?詞典包含值和一鍵獲取密鑰或有效完成此任務的方法?

//檢查字典已有sortedWord(即關鍵是字和值爲sortedWord)

if (anagramDict.ContainsValue(sortedWord)) 
    { 
     //Get the key for matching the sortedWord 
     string keyWord = anagramDict.Single(kvp => kvp.Value == sortedWord).Key; 

基本上扭轉這種問題的請求。 Dictionary ContainsKey and get value in one function

回答

2

您要求對應於某個值的「該」鍵,但可能有多個這樣的鍵。因此,您應該使用.First()而不是.Single()

而字典的排序順序是未定義的,所以查找「第一個」鍵是不明確的。

你可以做類似如下(也適用於那些價值類型的按鍵):

var keys = dict.Where(kvp => kvp.Value == sortedWord).Select(kvp => kvp.Key).ToList(); 
if (keys.Count > 0) 
{ 
    // Now you need to decide which matching key you want. 
    // If you don't care, you can take the first 
    key = keys[0]; 
} 

如果你不關心你哪個鍵,它是更有效地停在第一場比賽:

var keys = dict.Where(kvp => kvp.Value == sortedWord).Select(kvp => kvp.Key).Take(1).ToList(); 
if (keys.Count > 0) 
{ 
    key = keys[0]; 
} 

對於字典的鍵是引用類型(這是你的情況:我假設你的鑰匙是一個字符串),並假設你不關心你哪個鍵,可以簡化這:

var key = dict.Where(kvp => kvp.Value == sortedWord).Select(kvp => kvp.Key).FirstOrDefault(); 
if (key != null) 
{ 
    ... 
} 
+0

感謝喬的評論。同意使用.First()而不是.Single()。你說的是ContainsValue()而不是ContainsValue(),然後查找鍵並使用。這對我有意義。順便說一句,這是更快的ContainsValue()或上述查詢。 – Sikain

相關問題