使用LINQ遇到的问题,请高手解答下原理

潜意识中知道这是IEnumerable的延迟特性造成的,但是硬要条条框框地从原理上解释还真发现自己不行,所以来问问高手们了,同时我想也可以作为一个较为典型的问题,供使用着LINQ的开发者注意一下
直接看题目吧:
首先有一个MyClass类,代码如下
public   class  MyClass
{
    
private int i = 0;

    
public MyClass(int i)
    
{
        
this.i = i;
    }


    
public void MethodA()
    
{
        i
++;
    }


    
public void MethodB()
    
{
        Console.WriteLine(i);
    }

}

接着在Main函数中用两种方式返回一个MyClass的集合,分别是GetEnumerable和GetList
private   static  IEnumerable < MyClass >  GetEnumerable()
{
    
return
        intArray
        .Select(i 
=> new MyClass(i))
        .AsEnumerable();
}


private   static  IEnumerable < MyClass >  GetList()
{
    
return
        intArray
        .Select(i 
=> new MyClass(i))
        .ToList();
}
两个方法唯一的区别就在于,一个用了AsEnumerable,一个用了ToList,这里的intArray是早选定义好的private statice int[] intArray = new int[] { 1, 2, 3 };

然后调用如下
public   static   void  Main( string [] args)
{
    
//第一种情况,使用Enumerable
    IEnumerable<MyClass> ms = GetEnumerable();
    Console.WriteLine(
"第一种情况:");
    
foreach (MyClass m in ms)
    
{
        m.MethodA();
    }

    
foreach (MyClass m in ms)
    
{
        m.MethodB();
    }


    
//第二种情况,虽然ms还是IEnumberable,但事实上对象是个List
    ms = GetList();
    Console.WriteLine(
"第二种情况:");
    
foreach (MyClass m in ms)
    
{
        m.MethodA();
    }

    
foreach (MyClass m in ms)
    
{
        m.MethodB();
    }


    Console.Read();
}
对于每一种情况,都先执行MethodA使内部的i加上1,然后执行MethodB输出i
对于第二种情况,输出的是预期的2, 3, 4
而对于第一种情况,很遗憾,输出的是1, 2, 3

根据单步调试的结果, 事实上返回AsEnumerable()时,那个Select(i => new MyClass(i))每次foreach都要执行

还请高手说下原理,谢谢~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值