内连接,foreach循环中的错误

时间:2014-02-02 14:03:25

标签: c# linq foreach inner-join

我在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循环没有执行。并在循环后执行操作。为什么它不起作用。

1 个答案:

答案 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);