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



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

我看了这个论坛上已经问过的几个问题。一个非常接近我的场景是这样的:字典<字符串,列表><字典><字符串,字符串>>> 使用 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 表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型

我做错了什么?我该如何解决?

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

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

每当看到嵌套foreach时,LINQ 方法是使用SelectMany

查询不起作用,因为您选择的是 KeyValuePair 而不是每个Value字典,还因为您将可枚举对象传递给Where而不是返回bool的内容(所谓的谓词(。

最新更新