我有一个字典A(假设包含3个KVP)和一个包含许多KVP的字典列表。我需要验证是否有一些字典包含了字典A中的所有KVP。
字典A- 3KVP
列表A,其中包括3个字典,每个字典包含20KVP。
如何验证列表A中是否存在包含字典A中的所有KVP的字典?
发布于 2019-06-19 06:54:54
使用LINQ的Any
和All
方法可以非常简单地检查列表中的任何字典是否包含另一个字典的所有键/值对。
类似于下面这样的代码就可以做到:
var result = list.Any(d => dict.All(x => d.ContainsKey(x.Key) && d[x.Key] == x.Value));
这将检查列表中的任何字典是否具有与我们的目标字典具有相同值的所有键。
正如@mjwills在评论中指出的那样,通过使用字典的TryGetValue方法,您可以避免多次查找。这将如下所示:
var result = list.Any(d => dict.All(x => d.TryGetValue(x.Key, out var val) && val == x.Value));
这里假设一些值看起来像这样:
var list = new List<Dictionary<string,string>> {
new Dictionary<string,string> {
{"1","1"},
{"2","2"},
{"3","3"}
},
new Dictionary<string,string> {
{"4","4"},
{"5","5"},
{"6","6"}
},
new Dictionary<string,string> {
{"7","7"},
{"8","8"},
{"9","9"}
}
};
var dict =
new Dictionary<string,string> {
{"7","7"},
{"8","8"},
{"9","9"}
};
发布于 2019-06-20 00:22:36
正确的答案将取决于代码和代码部分是什么类型(例如,如果其中一个是代码,则相等比较更棘手),但通常情况下,假设所有键和值都正确地实现了它们的Equals
GetHashCode
和 Value
方法,我们可以使用<代码>D15扩展方法<代码>D16和<代码>D17来获得结果。
Except
方法返回第一个集合(compareDict
)中不在第二个集合(列表中的字典)中的所有项:
bool result = listOfDict.Any(dict => !compareDict.Except(dict).Any());
这表示,“当我们检查比较字典中所有条目与列表中每个字典之间的差异时,如果在至少一次比较中没有来自比较字典的剩余条目(否则返回false
__),则返回true
”。
这是因为Dictionary<TKey, TValue>
实现了IEnumerable<KeyValuePair<TKey, TValue>>
,而KeyValuePair<TKey, TValue>
实现了Equals
,这样如果Key
和Value
相等,它就会返回true
。
https://stackoverflow.com/questions/56657978
复制相似问题