不能不说的C#特性-迭代器(下),yield以及流的延迟计算

系列文章导航:

走进Linq--Linq横空出世篇

走进Linq-辉煌的背后

走进Linq-Linq大观园

不能不说的C#特性-对象集合初始化器

不能不说的C#特性-匿名类型与隐式类型局部变量

不能不说的C#特性-扩展方法

不能不说的C#特性-匿名方法和Lambda表达式

不能不说的C#特性-迭代器(上)及一些研究过程中的副产品

不能不说的C#特性-迭代器(下),yield以及流的延迟计算

走进Linq-Linq to Objects(上)基础篇

走进Linq-Linq to Objects(下)实例篇

走进Linq-Linq to SQL感性认识篇

走进Linq-Linq to SQL How do I(1)

走进Linq-Linq to SQL How do I(2)

走进Linq-Linq to SQL How do I(3)

走进Linq-How do I(4)拾遗补零篇第一节

走进Linq-Linq to SQL源代码赏析 Table 的获取过程

走进Linq-Linq to SQL源代码赏析之Provider的初始化

走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq


题目:从0遍历到20(不包括20),输出遍历到的每个元素,并将大于2的所有数字放到一个IEnumerable中返回

解答1:(我以前经常这样做)

static  IEnumerable < int >  WithNoYield()
        {
            IList
< int >  list  =   new  List < int > ();
            
for  ( int  i  =   0 ; i  <   20 ; i ++ )
            {
                Console.WriteLine(i.ToString());
                
if (i  >   2 )
                    list.Add(i);
            }
            
return  list;
        }

解答2:(自从有了C# 2.0我们还可以这样做)

static  IEnumerable < int >  WithYield()
        {
            
for  ( int  i  =   0 ; i  <   20 ; i ++ )
            {
                Console.WriteLine(i.ToString());
                
if (i  >   2 )
                    
yield   return  i;
            }
        }

如果我用下面这样的代码测试,会得到怎样的输出?

测试1:

测试WithNoYield()

static   void  Main()
        {
            WithNoYield();
            Console.ReadLine();
        }

测试WithYield()

  static   void  Main()
        {
            WithYield();
            Console.ReadLine();
        }

测试2:

测试WithNoYield()

static   void  Main()
        {
            
foreach  ( int  i  in  WithNoYield())
            {
                Console.WriteLine(i.ToString());
            }
            Console.ReadLine();
        }

测试WithYield()

static   void  Main()
        {
            
foreach  ( int  i  in  WithYield())
            {
                Console.WriteLine(i.ToString());
            }
            Console.ReadLine();
        }

给你5分钟时间给出答案,不要上机运行

你可能感兴趣的:(linq,C#,迭代器)