检查字典列表中是否存在字典?

时间:2016-03-07 13:17:36

标签: c# list dictionary

如何检查字典列表是否包含特定字典?

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

是否可以直接检查selectedItem中是否有detailsDictionary

答案:

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。我认为这是一个漫长的过程,应该有其他一些简单的方法。

3 个答案:

答案 0 :(得分:2)

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

str[1]

请注意,这具有 O(N)复杂性,因为它必须遍历列表中的每个项目,直到找到匹配或贯穿整个列表。如果这是一个问题,您可能希望使用HashSet来缓存您的列表,Contains具有{{3}}方法(在大多数情况下)工作得更快。

答案 1 :(得分:0)

或者,如果您的意思是selectedItemdetailsDictionary的元素共享相同的键,而不是它们是相同的对象:

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

显然这种情况比较缓慢,就像格迪米纳斯提到的那样,如果速度至关重要,可能会有更好的方法。

答案 2 :(得分:0)

我在代码中使用的解决方案检查每个selectedItem项中是否存在detailsDictionary的值,

detailsDictionary.Any(x=> x.Values.SequenceEqual(selectedItem.Values));

这假设字典列表是相同种类的所有字典(标题相同)。 如果没有,您可以执行以下操作:

detailsDictionary.Any(x=> x.Values.SequenceEqual(selectedItem.Values) &&
                          x.Keys.SequenceEqual(selectedItem.Values));

但是我对这种方法的效率了解不多。