2016-03-07 184 views
1

如何檢查字典列表是否包含特定字典?檢查字典列表中是否存在字典?

private List<Dictionary<string, object>> detailsDictionary; 
private Dictionary<string, object> selecteItem; 

有沒有直接的方法來檢查,如果selectedItemdetailsDictionary

答:

bool isPresent=false; 
foreach(Dictionary<string,object> dic in detailsDictionary) 
        { 
         if (DictionaryExtensionMethods.ContentEquals(selectedItem, dic)) 
         { 
          isPresent= true; 
          break; 
         } 
        } 


public static class DictionaryExtensionMethods 
{ 
    public static bool ContentEquals<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, Dictionary<TKey, TValue> otherDictionary) 
    { 
     return (otherDictionary ?? new Dictionary<TKey, TValue>()) 
      .OrderBy(kvp => kvp.Key) 
      .SequenceEqual((dictionary ?? new Dictionary<TKey, TValue>()) 
           .OrderBy(kvp => kvp.Key)); 
    } 
} 

我手動比較每個字典列表與選定的字典,讓isPresent = true,如果兩個字典相等。我認爲它是一個漫長的過程,應該有其他簡單的方法。

+0

您可以使用'Contains'假設您做了參考搜索,而不是搜索具有相同鍵和值的字典。 – juharr

+2

如果字典包含相同的密鑰但具有不同的值,會發生什麼情況? –

+1

如果你正在考慮比較字典的平等,那麼你正在追求錯誤的解決方案。請不要問XY問題。 –

回答

2

您可以檢查任何項目是否是列表中使用IList.Contains方法:

bool contains = detailsDictionary.Contains(selectedItem); 

注意這O(N)的複雜性,因爲它有去,雖然在每一個項目該列表,直到它找到一個匹配或貫穿整個列表。如果這是一個問題,您可能需要使用HashSet來緩存您的列表,該列表有一個Contains方法,(在大多數情況下)的工作速度更快。

+0

感謝您的回覆朋友。但上面的代碼不工作,即使detailsDictionary包含selectedItem值表達式「detailsDictionary.Contains(selectedItem);」返回false – Joee

+0

@Joee它包含*相同的列表*或*包含相同項目的列表*?這是兩回事。 –

+0

我不知道你的問題的確切答案,但我的需要是我有詞典列表(例如:> detailsDictionary),它包含一個字典具有相同的鍵,值和計數(例如: Dictionary selecteItem)這個字典。我想找到天氣「selectedItem」字典在「detailsDictionary」 – Joee

0

或者,如果你的意思是哪裏selectedItemdetailsDictionary共享的元素相同的密鑰,而不是它們是相同的對象:

detailsDictionary.Any(dict => dict.Count == selectedItem.Count && dict.Keys.All(key => selectedItem.ContainsKey(key))); 

顯然,這是慢,像格迪米納斯提到,有可能是一個更好的辦法如果速度是關鍵。

+0

感謝您的重播。我檢查了上面的代碼,它不返回bool值,而是返回數字282 – Joee