我需要将一个传统逻辑转换为 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
的内容(所谓的谓词(。