在下面的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)
这是因为你正在关闭一个循环变量.我根本无法解释它比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)
问题就会消失.