C# 如何验证是否所有字典KVP都包含在列表中的其他一些字典中
我有一个字典A(假设包含3个KVP)和一个包含许多KVP的字典列表。我需要验证是否有某个字典包含字典A中的所有KVP 字典A-3KVP 列表A包括3个字典,每个字典包含20KVPC# 如何验证是否所有字典KVP都包含在列表中的其他一些字典中,c#,.net,linq,C#,.net,Linq,我有一个字典A(假设包含3个KVP)和一个包含许多KVP的字典列表。我需要验证是否有某个字典包含字典A中的所有KVP 字典A-3KVP 列表A包括3个字典,每个字典包含20KVP 如何验证列表A中是否有任何字典包含字典A中的所有KVP?使用LINQ的any和all方法,检查列表中的任何字典是否包含另一个字典的所有键/值对非常简单 类似于以下的操作可以做到这一点: var result = list.Any(d => dict.All(x => d.ContainsKey(x.Key)
如何验证列表A中是否有任何字典包含字典A中的所有KVP?使用LINQ的
any
和all
方法,检查列表中的任何字典是否包含另一个字典的所有键/值对非常简单
类似于以下的操作可以做到这一点:
var result = list.Any(d => dict.All(x => d.ContainsKey(x.Key) && d[x.Key] == x.Value));
这将检查列表中的任何字典是否具有与目标字典值相同的所有键
正如@mjwills在注释中指出的那样,通过使用Dictionary的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"}
};
var list=新列表{
新词典{
{"1","1"},
{"2","2"},
{"3","3"}
},
新词典{
{"4","4"},
{"5","5"},
{"6","6"}
},
新词典{
{"7","7"},
{"8","8"},
{"9","9"}
}
};
变量dict=
新词典{
{"7","7"},
{"8","8"},
{"9","9"}
};
使用LINQ的any
和all
方法,检查列表中的任何词典是否包含另一个词典的所有键/值对非常简单
类似于以下的操作可以做到这一点:
var result = list.Any(d => dict.All(x => d.ContainsKey(x.Key) && d[x.Key] == x.Value));
这将检查列表中的任何字典是否具有与目标字典值相同的所有键
正如@mjwills在注释中指出的那样,通过使用Dictionary的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"}
};
var list=新列表{
新词典{
{"1","1"},
{"2","2"},
{"3","3"}
},
新词典{
{"4","4"},
{"5","5"},
{"6","6"}
},
新词典{
{"7","7"},
{"8","8"},
{"9","9"}
}
};
变量dict=
新字典{
{"7","7"},
{"8","8"},
{"9","9"}
};
正确答案将取决于键和值的类型(如果其中一个是列表,例如,相等比较比较比较困难),但一般来说,假设所有键和值的相等
和GetHashCode
方法都正确实现,我们可以使用系统.Linq
扩展方法任何
和除
之外的方法来获得结果
Except
方法返回第一个集合(compareDict
)中不在第二个集合(列表中的字典)中的所有项:
这表示,“如果在检查比较字典中所有项目与列表中每个字典之间的差异时,至少一次比较中没有来自比较字典的剩余项目(否则返回false
),则返回true
”
这是因为字典实现了IEnumerable
,和KeyValuePair
实现等于,如果键
和值
相等,则返回true
。正确答案取决于键
和值
部分的类型(例如,如果其中一个是列表
,那么equals比较就比较棘手),但一般来说,假设所有键和值的都等于和GetHashCode
方法都正确实现了,我们可以使用系统.Linq
扩展方法任何和除之外的方法来获得结果
Except
方法返回第一个集合(compareDict
)中不在第二个集合(列表中的字典)中的所有项:
这表示,“如果在检查比较字典中所有项目与列表中每个字典之间的差异时,至少一次比较中没有来自比较字典的剩余项目(否则返回false
),则返回true
”
这是因为字典
实现了IEnumerable
,而KeyValuePair
实现了等于,这样如果键和值都相等,它就会返回true
。这不会将字典用作IEnumerable
,并失去con>的好处吗固定时间查找?这难道不会将字典用作IEnumerable
,从而失去固定时间查找的好处吗?