如何验证所有字典KVP是否包含在列表中的其他一些字典中

时间:2019-06-18 22:46:31

标签: c# .net linq

我有一个字典A(假设包含3个KVP)和一个包含许多KVP的字典列表。我需要验证是否有一些字典,其中包括字典A中的所有KVP。

字典A-3KVP

列表A包含3个字典,每个字典包含20KVP。

如何验证条件,即列表A中是否有包含词典A中所有KVP的词典?

2 个答案:

答案 0 :(得分:4)

使用LINQ的AnyAll方法,非常简单地检查列表中的任何词典是否包含另一个词典的所有键/值对。

可以执行以下操作:

var result = list.Any(d => dict.All(x => d.ContainsKey(x.Key) && d[x.Key] == x.Value));

这将检查列表中的任何词典是否具有与我们的目标词典具有相同值的所有键。

通过使用Dictionary的TryGetValue方法,可以避免多次查找,如@mjwills在注释中指出的。如下所示:

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"}
    };

答案 1 :(得分:0)

正确答案取决于KeyValue部分的类型(例如,如果其中一个是List<T>,则equals比较比较棘手),但是在通常, 假设所有键和值的EqualsGetHashCode方法正确实现 ,我们可以使用System.Linq扩展名方法AnyExcept获得结果。

Except方法返回第一个集合(compareDict)中不在第二个集合(列表中的字典)中的所有项目:

bool result = listOfDict.Any(dict => !compareDict.Except(dict).Any());

这表示,“返回true,如果当我们检查比较字典中所有项目与列表中每个字典之间的差异时,比较字典中是否没有剩余项目(否则返回false),至少进行一次比较”。

之所以有效,是因为Dictionary<TKey, TValue>IEnumerable<KeyValuePair<TKey, TValue>>都实现了KeyValuePair<TKey, TValue>,而Equals实现了true使得Key和{{1} Value相等。