我的问题是为什么我在lambda表达式中使用迭代器变量得到错误的结果。
我已经按照SWeko的回答here了。但它对我没有用 这是我的伪代码:
List<string> list = new List<string>(3);
// where list.Count=3
for (int i=0;i<list.Count;i++){
int yy=i;
AFunctionWithLambda(() => Console.WriteLine (list[yy]));
}
但是控制台只写
list[3]
三次,好像唯一的价值是&#34; yy&#34;可能是&#34; i&#34;的最后一个值。 它似乎有效,因为在宣布&#34; yy&#34;变量,控制台返回&#34; i = 1&#34;但事实并非如此,我不知道自己在做什么。
感谢您的建议!
答案 0 :(得分:2)
我想我知道你在做什么。要完成它,您需要以下内容:
for (int i=0;i<list.Count;i++){
String s=list[i] ;
AFunctionWithLambda(() => Console.WriteLine(s));
}
我假设AFunctionWithLambda正在将动作添加到动作列表中?然后你在这个for循环之后执行这些动作?使用您的代码,所有操作都引用了i,在for循环结束时将其设置为3.当您运行的每个操作i仍然设置为3.使用上面的方法,我们创建了3个单独的字符串并且action有自己对正确字符串的引用。
确保填充字符串列表,否则您将无法获得任何输出。
答案 1 :(得分:0)
很难从你的例子中看出,因为它似乎完美地形成并正确捕捉。这是我的扩展版本,它工作正常:
public void Main()
{
List<string> list = new List<string>(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
答案 2 :(得分:0)
我有一个解决方案:
我不能在lambda表达式中使用loop-variable,但是我可以创建一个新的方法来做到这一点。
它会像
{
for (int i=0;i<list.count;i++){
ToAction(i);
}
}
void ToAction(int value){
AFunctionWithLambda(()=>Console.WriteLine(list[value]);
}
并且工作正常
感谢所有提出这个(愚蠢)问题的人:D