【问题标题】:Inner join, error in foreach cycle内部连接,foreach 循环出错
【发布时间】:2014-02-26 00:01:14
【问题描述】:

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

【问题讨论】:

  • 快速提示,任何时候你都可以someVar.Count() == 0,你几乎总是可以用!someVar.Any()替换它,它会更快(someVar.Count() != 0变成someVar.Any()

标签: c# linq foreach inner-join


【解决方案1】:

您应该知道,LINQ 查询不是在创建时执行,而是在评估时执行(因此当您访问结果时)。 在您的场景中,您在此处执行查询:

foreach (var pair in InnerJoinParam)

但在您到达那里之前,您已经清除了您的parametrsAll,因此查询在执行时不会返回任何结果:

parametrsAll.Clear(); 
foreach (var pair in InnerJoinParam) //depends on parametrsAll

所以你应该在foreach 循环之后移动parametrsAll.Clear()

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

【讨论】:

  • 在循环之前评估结果是对的,但转换为 Dictionary 不会这样做。
  • 你是对的,我的错误,我已经纠正了我的答案
猜你喜欢
  • 2015-10-30
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2016-09-26
相关资源
最近更新 更多