2012-03-10 56 views
18

一個如何檢查是否在Dictionary <>存在鍵/值對存在一個鍵,值對?我可以使用ContainsKeyContainsValue來檢查密鑰或值是否存在,但我不確定如何檢查密鑰/值對是否存在。如何檢查是否在Dictionary

感謝

回答

36

對如果關鍵不存在......所以取與鍵關聯的值,並檢查是否這就是你要找的價值不能存在。因此,例如:

// Could be generic of course, but let's keep things simple... 
public bool ContainsKeyValue(Dictionary<string, int> dictionary, 
          string expectedKey, int expectedValue) 
{ 
    int actualValue; 
    if (!dictionary.TryGetValue(expectedKey, out actualValue)) 
    { 
     return false; 
    } 
    return actualValue == expectedValue; 
} 

或稍多 「巧妙地」(通常是一些以避免...):

public bool ContainsKeyValue(Dictionary<string, int> dictionary, 
          string expectedKey, int expectedValue) 
{ 
    int actualValue; 
    return dictionary.TryGetValue(expectedKey, out actualValue) && 
      actualValue == expectedValue; 
} 
0

如何像這樣

bool exists = dict.ContainsKey("key") ? dict["key"] == "value" : false; 
+3

使用TryGetValue的一般版本而不是檢查。 – Marlon 2012-03-10 21:37:57

+2

爲什麼查找兩次? – 2012-03-10 21:38:01

-1

首先,你檢查鍵存在,如果是這樣,你得到的價值爲這個關鍵,並將其與正在測試......如果他們是平等的價值,你的字典包含對

22

字典只支持每一個鍵的值,因此:

// key = the key you are looking for 
// value = the value you are looking for 
YourValueType found; 
if(dictionary.TryGetValue(key, out found) && found == value) { 
    // key/value pair exists 
} 
+0

我稍微不喜歡在一個表達式中設置和使用'found'。 – CodesInChaos 2012-03-11 17:43:37

+3

@CodeInChaos爲什麼?行爲被明確定義爲永遠有效... – 2012-03-11 19:04:49

+0

我知道它是很好的定義。這只是一種文體偏好。就像我試圖讓每個陳述只有一個副作用,這也是該陳述中發生的最後一件事情。 – CodesInChaos 2012-03-11 19:27:27

5
if (myDic.ContainsKey(testKey) && myDic[testKey].Equals(testValue)) 
    return true; 
+2

改爲使用TryGetValue。 – Marlon 2012-03-10 21:37:21

+0

是的,它的工作原理。這不是說明性的。我選擇了這一個來使邏輯清晰,而不是優化性能。 – 2012-03-12 15:07:30

+0

我們談論的這個特定場景不是關於(微)優化。它更多的是瞭解.NET詞典如何工作,O(k)複雜性等。這裏正確地使用trygetvalue。 – nawfal 2013-04-01 21:32:53

3

您可以通過使用dictionary.TryGetValue做到這一點。

Dictionary<string, bool> clients = new Dictionary<string, bool>(); 
        clients.Add("abc", true); 
        clients.Add("abc2", true); 
        clients.Add("abc3", false); 
        clients.Add("abc4", true); 

        bool isValid = false; 

        if (clients.TryGetValue("abc3", out isValid)==false||isValid == false) 
        { 
         Console.WriteLine(isValid); 
        } 
        else 
        { 
         Console.WriteLine(isValid); 
        } 

在上面的代碼,如果條件有兩個部分第一個用於檢查密鑰具有價值,第二個實際值與預期值進行比較。

First Section{clients.TryGetValue("abc3", out isValid)==false}||Second Section{isValid == false} 
-4

請下面的代碼

var dColList = new Dictionary<string, int>(); 
if (!dColList.Contains(new KeyValuePair<string, int>(col.Id,col.RowId))) 
{} 

感謝, 馬赫什摹

+1

這會比其他選項慢很多,因爲您沒有利用字典功能快速查找關鍵字。 – Servy 2017-03-14 15:21:23

0

Jon Skeet的回答

 public bool ContainsKeyValue<TKey, TVal>(Dictionary<TKey, TVal> dictionnaire, 
              TKey expectedKey, 
              TVal expectedValue) where TVal : IComparable 
    { 
     TVal actualValue; 

     if (!dictionnaire.TryGetValue(expectedKey, out actualValue)) 
     { 
      return false; 
     } 
     return actualValue.CompareTo(expectedValue) == 0; 
    }