从集合中检索lambda表达式

buf*_*erz 4 c# lambda

我对C#中的lambda表达式很新,而且我很难概念化它们在集合中的存储/检索方式.

我正在尝试以编程方式创建10个Funcs x => x + 1,x => x + 2等的列表作为测试.我想要的输出是0,1,2,3,4,5,6,7,8,9

这是我的代码:

 var list = new List<Func<int, int>>();
 for (int i = 0; i < 10; i++)
 {     
   Func<int, int> func = x => x + i;
   Console.WriteLine("a) " + func.Invoke(0)); //returns 0,1,2,3,4,5,6,7,8,9

   list.Add(func);
   Console.WriteLine("b) " + list[i].Invoke(0)); //returns 0,1,2,3,4,5,6,7,8,9
 }

 foreach (var func in list) //returns 10,10,10,10,10,10,10,10,10,10
   Console.WriteLine("c) " + func.Invoke(0)); 

 for(int i = 0; i < list.Count; i++) //returns 10,10,10,10,10,10,10,10,10,10
    Console.WriteLine("d) " + list[i].Invoke(0)); 
Run Code Online (Sandbox Code Playgroud)

Func数组替换为List [Func]时,我得到相同的结果.

我错过了什么?

Ray*_*gus 7

通过将lambda复制到一个新变量中,使其成为lambda的本地:

var list = new List<Func<int, int>>();
for (int i = 0; i < 10; i++)
{
    var temp = i;
    Func<int, int> func = x => x + temp;
    Console.WriteLine("a) " + func.Invoke(0)); //returns 0,1,2,3,4,5,6,7,8,9

    list.Add(func);
    Console.WriteLine("b) " + list[i].Invoke(0)); //returns 0,1,2,3,4,5,6,7,8,9
}

foreach (var func in list) //returns 0,1,2,3,4,5,6,7,8,9
    Console.WriteLine("c) " + func.Invoke(0));

for (int i = 0; i < list.Count; i++) //returns 0,1,2,3,4,5,6,7,8,9
    Console.WriteLine("d) " + list[i].Invoke(0));
Run Code Online (Sandbox Code Playgroud)


Dav*_*eer 6

我想你看到了这里描述的行为:

http://blogs.msdn.com/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx

  • 在哪里"有趣"你的意思是"怪胎'烦人".:-) (2认同)