如何检查字典列表是否包含特定字典?
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。我认为这是一个漫长的过程,应该有其他一些简单的方法。
答案 0 :(得分:2)
您可以使用IList.Contains
方法检查列表中是否有任何项目:
str[1]
请注意,这具有 O(N)复杂性,因为它必须遍历列表中的每个项目,直到找到匹配或贯穿整个列表。如果这是一个问题,您可能希望使用HashSet
来缓存您的列表,Contains
具有{{3}}方法(在大多数情况下)工作得更快。
答案 1 :(得分:0)
或者,如果您的意思是selectedItem
和detailsDictionary
的元素共享相同的键,而不是它们是相同的对象:
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));
但是我对这种方法的效率了解不多。