C# - For循环和lambda表达式

时间:2015-11-13 00:21:03

标签: c# for-loop lambda

我的问题是为什么我在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;但事实并非如此,我不知道自己在做什么。

感谢您的建议!

3 个答案:

答案 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