我在c#中遇到linq查询问题。我为我的两个列表/集合编写内部联接:
var InnerJoin =
from itemA in listA
join itemB in listB
on itemA equals itemB
select new { itemA };
这适用于这个:
var listA = new List<string>() {"aaaa", "bbbb", "cccc", "dddd"};
var listB = new List<string>() { "zzzz", "bbbb"};
但我想将它应用于我的词典
var parametrsSelected = new Dictionary<string, string>()
{
{"kind", "favorite data"}
};
var parametrsAll = new Dictionary<string, string>()
{
{"kind", "Null"}, {"id","Null"}, {"type","Null"}
};
var InnerJoinParam =
from itemA in parametrsAll
join itemB in parametrsSelected
on itemA.Key equals itemB.Key
select new { itemB };
if (InnerJoinParam.Count() == 0)
return -1;
else
{
parametrsAll.Clear();
foreach (var pair in InnerJoinParam)
{
parametrsAll.Add(pair.itemB.Key, pair.itemB.Value);
}
}
但是我有一个错误:InnerJoinParam.Count()
返回Count = 1
,但是foreach循环没有执行。并在循环后执行操作。为什么它不起作用。
答案 0 :(得分:2)
您应该意识到LINQ查询在创建时不会执行,但是在评估它们时(因此当您访问结果时)。 在您的方案中,您可以在此处执行查询:
foreach (var pair in InnerJoinParam)
但是在你到达那里之前,你已经清除了parametrsAll
,因此查询在执行时不会返回任何结果:
parametrsAll.Clear();
foreach (var pair in InnerJoinParam) //depends on parametrsAll
所以你应该在parametrsAll.Clear()
循环之后移动foreach
:
else
{
var paramsList = new Dictionary<string,string>();
foreach (var pair in InnerJoinParam)
{
paramsList.Add(pair.itemB.Key, pair.itemB.Value);
}
parametrsAll.Clear();
parametrsAll = paramsList;
}
或者只是在foreach循环之前评估查询结果:
var results =
from itemA in parametrsAll
join itemB in parametrsSelected
on itemA.Key equals itemB.Key
select new { itemB };
var InnerJoinParam = results.ToDictionary( x=> x.Key, x => x.Value);