public static IEnumerable<Func<int>> GetFunctions(){ for(int i = 1; i <= 10; i++) yIEld return new Func<int>(() => i);}public static IEnumerable<Func<int>> GetFunctionslinq(){ return Enumerable.Range(1,10).Select(i => new Func<int>(() => i));}
然而,当它们转换为List< Func< int>>时,它们产生不同的结果:
List<Func<int>> yIEldList = GetFunctions().ToList();List<Func<int>> linqList = GetFunctionslinq().ToList();foreach(var func in yIEldList) Console.Writeline("[YIELD] {0}",func());Console.Writeline("==================");foreach(var func in linqList) Console.Writeline("[liNQ] {0}",func());
输出是:
[YIELD] 11[YIELD] 11[YIELD] 11[YIELD] 11[YIELD] 11[YIELD] 11[YIELD] 11[YIELD] 11[YIELD] 11[YIELD] 11==================[liNQ] 1[liNQ] 2[liNQ] 3[liNQ] 4[liNQ] 5[liNQ] 6[liNQ] 7[liNQ] 8[liNQ] 9[liNQ] 10
为什么是这样?
解决方法 这是关闭问题.您必须将变量存储在循环内以解决此问题.for (int i = 1; i <= 10; i++){ var i1 = i; yIEld return new Func<int>(() => i1);}
实际上是新的Func< int>(()=> i);使用计数器内部循环的确切值,这不是副本.所以在循环结束后你总是得到11,因为它是设置为反击的最后一个值.
总结以上是内存溢出为你收集整理的c# – yield return和LINQ Select之间的结果不同全部内容,希望文章能够帮你解决c# – yield return和LINQ Select之间的结果不同所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)