LINQ to Dictionary with AND condition

时间:2015-03-15 18:07:20

标签: c# linq dictionary

我有一个名为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);

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