c# – yield return和LINQ Select之间的结果不同

c# – yield return和LINQ Select之间的结果不同,第1张

概述我一直认为这两种方法是相似的: public static IEnumerable<Func<int>> GetFunctions(){ for(int i = 1; i <= 10; i++) yield return new Func<int>(() => i);}public static IEnumerable<Func<int>> GetFunctio 我一直认为这两种方法是相似的:
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之间的结果不同所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1248859.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存