传统循环与LINQ - 不同的输出

gov*_*vin 5 .net c# linq

在下面的C#代码中,为什么第一组打印产生的输出为

C
C
C.

但LINQ相当于产生的输出

A
B
C.

我理解第一组输出 - 当它退出循环时它取最后一个值,但在我看来传统循环和LINQ等价物之间应该有一致性吗? - 在这两种情况下都应该打印CCC或ABC吗?

public static void Main(string[] str)
    {
        List<string> names = new List<string>() {"A", "B", "C"};

        List<Action> actions = new List<Action>();
        foreach(var name in names)
        {
            actions.Add(() => Console.WriteLine(name));
        }

        foreach(var action in actions)
        {
            action.Invoke();
        }

        List<Action> actionList = names.Select<string, Action>(s => () => Console.WriteLine(s)).ToList();

        foreach(var action in actionList)
        {
            action.Invoke();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Dav*_*kle 7

这是因为你正在关闭一个循环变量.我根本无法解释它比Lippert更好.(任何人都可以?)如果你仍然感到困惑,可以花点时间思考一下并阅读他博客上的评论 - 他们应该具有启发性.

使用Linq时这是一个非常常见的错误.几乎每个人都做到了.在C#5.0(在Visual Studio 2012中使用)编译器中,此行为已更改,但如果您可以帮助它,仍应避免执行此操作.您可以将第一个循环重写为:

foreach(var name in names)
    {
        var currentName = name;
        actions.Add(() => Console.WriteLine(currentName));
    }
Run Code Online (Sandbox Code Playgroud)

问题就会消失.