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