我对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]时,我得到相同的结果.
我错过了什么?
通过将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)
我想你看到了这里描述的行为: