LINQ然后在圈子里

时间:2018-01-19 07:01:18

标签: c# linq cycle

为什么我在 gg 中有不同的结果?

  1. 版本:

    var kk = ff.OrderBy(el => el.path[0]);
    
    for (var i = 1; i <= 2; i++)
      {
          kk = kk
              .ThenBy(el => el.path.Length > i
              ? el.path[i]
              : 0);
      }
    
    var gg = kk.ToList();
    
  2. 版本:

    var kk = ff.OrderBy(el => el.path[0]);
    
     kk = kk
          .ThenBy(el => el.path.Length > 1
           ? el.path[1]
           : 0)
          .ThenBy(el => el.path.Length > 2
           ? el.path[2]
           : 0);
    
    var gg = kk.ToList();
    
  3. 我需要版本2的结果,但我需要循环

1 个答案:

答案 0 :(得分:0)

这是因为在lambda表达式之外声明的任何变量都不会在lambda中捕获,即你不会在每个lambda中创建i的多个版本。

例如,

List<Action> actions = new List<Action>();
for (int i = 0 ; i < 10 ; i++) {
    actions.Add(() => Console.WriteLine(i));
}
actions.ForEach(x => x.Invoke());

按照您的预期打印10 10次,而不是0到9次。你的代码中也会发生同样的事情。您的第一个代码段与此相同:

 kk = kk
  .ThenBy(el => el.path.Length > 1
   ? el.path[3]
   : 0)
  .ThenBy(el => el.path.Length > 2
   ? el.path[3]
   : 0);