我需要将一种传统逻辑转换为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();
但这给了我两个错误:
我在做什么错?以及如何解决?
答案 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
(所谓谓语)。