建立LINQ查询以从字符串字典/哈希获取字典列表字符串字典/字符串字典?

时间:2019-08-28 15:39:57

标签: c# linq

我需要将一种传统逻辑转换为LINQ查询(方法语法)。

我看了已经在这个论坛上问过的几个问题。非常接近我的情况的一个是:Dictionary<string, List<Dictionary<string,string>>> query using linq。但是我仍然很难将下面的逻辑转换为等效的LINQ(方法语法)查询。我需要帮助。我仍在学习LINQ,所以请多包涵。

Dictionary<String, HashSet<Dictionary<String, String>>> myData = BuildMyData();
String givenKey = GetGivenKey();
String givenValue = GetGivenValue();

// I need LINQ (Method syntax) equivalant to following logic:
List<Dictionary<String, String>> matched = new List<Dictionary<String, String>>();
foreach(KeyValuePair<String, HashSet<Dictionary<String, String>>> kvp in myData)
    foreach (Dictionary<String, String> dict in kvp.Value)
        if (dict.ContainsKey(givenKey) && dict[givenKey] == givenValue)
        {
            matched.Add(dict);
            break;
        }

如何使用LINQ方法语法构建matched

我尝试了以下操作,但这给了我两个错误-

matched = myData.Where(kvp => kvp.Value.Where(dict =>
                dict.ContainsKey(givenKey) && dict[givenKey] == givenValue)).ToList();

但这给了我两个错误:

  • CS0029无法将类型'System.Collections.Generic.IEnumerable>'隐式转换为'bool'
  • CS1662无法将lambda表达式转换为预期的委托类型,因为该块中的某些返回类型不能隐式转换为委托的返回类型

我在做什么错?以及如何解决?

1 个答案:

答案 0 :(得分:3)

您可以使用SelectMany获取每个值中的字典:

 matched = myData
    .SelectMany(kv => kv.Value)
    .Where(dict => dict.TryGetValue(givenKey, out string value) && value == givenValue)
    .ToList();

每当看到嵌套的foreach时,LINQ方式就是使用SelectMany

您的查询不起作用,因为您选择的是KeyValuePairs而不是每个Value的字典,还因为您将枚举传递给Where而不是返回bool(所谓谓语)。