2016-03-07 136 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