我有一个名为recsList的List<Dictionary<string,string>>
。以下两个查询检查recsList中每个Dictionary中两个单独键中某些值的任何实例。
我需要将这些查询与AND条件组合在一起,这样如果相同的Dictionary满足两个条件,我就会得到true。
bool multipleCodesFound = recsList.SelectMany(a => a)
.Where(x => x.Key.Equals("multCodesFound")).Any((y => y.Value == (true).ToString()));
bool doubleCRLFFound = recsList.SelectMany(a => a)
.Where(x => x.Key.Equals("CountofCRLF")).Any(y => int.Parse(y.Value) > 1);
答案 0 :(得分:3)
听起来这就是你想要的。这也应该比你上面做的更有效,因为你的方法迭代每个字典的每个键,直到它找到匹配(使使用字典的效率优势无效):
bool isAMatch = recsList.Any(d => d.ContainsKey("multCodesFound") &&
d.ContainsKey("CountofCRLF") &&
d["multCodesFound"] == bool.TrueString &&
int.Parse(d["CountofCRLF"]) > 1);
正如ytoledano所指出的那样,使用ContainsKey
后跟字典检索效率很低,因为它需要两次查找。为了避免性能损失,你可以使用下面的方法,虽然我会说在这样的情况下,为了获得更简洁的代码,可能值得采取性能命中:
bool isAMatch = recsList.Any(d => {
string val;
return d.TryGetValue("multCodesFound", out val) &&
val == bool.TrueString &&
d.TryGetValue("CountofCRLF", out val) &&
int.Parse(val) > 1;
});