加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:23:25 所属栏目:百科 来源:网络整理
导读:我一直认为这两种方法是相似的: public static IEnumerableFuncint GetFunctions(){ for(int i = 1; i = 10; i++) yield return new Funcint(() = i);}public static IEnumerableFuncint GetFunctionsLinq(){ return Enumerable.Range(1,10).Select(i = new
我一直认为这两种方法是相似的:
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,因为它是设置为反击的最后一个值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读