C# – For循环和lambda表达式

我的问题是为什么我在lambda表达式中使用迭代器变量得到错误的结果。

好吧,我已经按照SWeko的回答了 。 但它对我不起作用这是我的伪代码:

List list = new List(3); // where list.Count=3 for (int i=0;i Console.WriteLine (list[yy])); } 

但控制台只写道

 list[3] 

三次,好像唯一的“yy”值是“i”的最后一个值似乎有效,因为在声明“yy”变量之前,控制台返回“i = 1”但它并不是真的,我不知道我在做什么。

谢谢你的建议!

从你的例子中很难说,因为它似乎完美地形成并正确捕捉。 这是我的扩展版本,它工作正常:

  public void Main() { List list = new List(3) { "a", "b", "c"}; for (int i = 0; i < list.Count; i++) { int yy = i; AFunctionWithLambda(() => Console.WriteLine(list[yy])); } Thread.Sleep(1000); Console.WriteLine("all done, probably"); Console.ReadLine(); } private void AFunctionWithLambda(Action action) { // runs it asynchronously, for giggles ThreadPool.QueueUserWorkItem(o => { Thread.Sleep(500); // delay, to let the loop finish action(); }); } 

如果您将其更改为:

  for (int i = 0; i < list.Count; i++) { AFunctionWithLambda(() => Console.WriteLine(list[i])); } 

然后它以单独描述的方式失败。

我们需要一个更好的例子; p

我想我知道你要做什么。 要完成它,您需要以下内容:

 for (int i=0;i Console.WriteLine(s)); } 

我假设AFunctionWithLambda将动作添加到动作列表中? 然后你在这个for循环之后执行这些动作? 使用您的代码,所有操作都引用了i,在for循环结束时将其设置为3.当您的每个操作运行时,i仍设置为3.使用上面的方法,我们创建了3个单独的字符串并且action有自己对正确字符串的引用。

确保填充字符串列表,否则您将无法获得任何输出。

我有一个解决方案:

我不能在lambda表达式中使用loop-variable,但是我可以创建一个新方法来做到这一点。

它会是这样的

 { for (int i=0;iConsole.WriteLine(list[value]); } 

它工作正常

感谢所有提出这个(愚蠢)问题的人:D