C#中yield return用法分析

摘要:
第一种方法是将所有结果集加载到内存中,然后遍历;第二种方法是,每次客户端调用时,yield返回都会向客户端返回一个值,即“按需供应”。

 staticList<int> GetInitialData()

{
  returnnewList<int>(){1,2,3,4};
}
打印出所有值大于2的元素
 
不使用yield return的实现
staticIEnumerable<int> FilterWithoutYield()
{
  List<int> result = newList<int>();
  foreach(inti inGetInitialData())
  {
 if(i > 2)
 {
   result.Add(i);
 }
  }
  returnresult;
}
 
使用yeild return实现
staticIEnumerable<int> FilterWithYield()
{
  foreach(inti inGetInitialData())
  {
 if(i > 2)
 {
   yieldreturni;
 }
  }
  yieldbreak;
  Console.WriteLine("这里的代码不执行");
}

总结:

通过单步调试发现:

虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。

第一种方法,客户端调用过程大致为:

C#中yield return用法分析第1张

使用yield return,客户端调用过程大致为:

C#中yield return用法分析第2张

 

so,like this is cool:

C#中yield return用法分析第3张C#中yield return用法分析第4张
        /// <summary>
        /// 递归构造商品分类
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        private IEnumerable<ProductCategory> RecursionCategory(IEnumerable<ProductCategoryExt> source)
        {
            if (source.IsHasRow())
            {
                foreach (var item in source)
                {
                    yield return new ProductCategory()
                    {
                        ParentId = item.ParentId,
                        CateId = item.ProductCategoryId,
                        CateName = item.VchMobileShowName,
                        IcoUrl = item.CatePic, 
                    };
                }
            }
        }
View Code

 

 

 

免责声明:文章转载自《C#中yield return用法分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Django多级评论NPOI操作EXCEL----------NPOI基础01下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

你真的了解python的with语句吗?通过分析contextlib源码让你彻底掌握with的用法

楔子 下面我们来聊一下Python中的上下文管理,Python中的上下文管理我们可以通过with语句实现。在Python中使用with语句最多的情况,莫过于操作文件了,比如我们在打开一个文件的时候会通过类似于with open("test.txt", encoding="utf-8") as f: 这种形式打开,这种方式的好处就在于with语句结束后会自动...

Generator函数

1,概念: Generator函数有多种理解角度。从语法上,首先可以把它理解成,Generator函数一个状态机,封装了多个内部状态。 执行Generator函数会返回一个遍历器对象,也就是说,Generator函数除了状态机,还是一个遍历器对象生成函数。 2,特征: 一是,function关键字与函数名之间有一个星号; 二是,函数体内部使用yield语句...

迭代器模式 与 C# IEnumerator/IEnumerable

Part1 迭代器模式 与 接口 IEnumerable IEnumerator interface IEnumerable { IEnumerator GetEnumerator(); } // 泛型版本 : IEnumerator<T> interface IEnumerator { object Current { g...

现代 PHP 新特性系列(四) —— 生成器的创建和使用

1、概述      生成器是 PHP 5.5 引入的新特性,但是目测很少人用到它,其实这是个非常有用的功能。      生成器和迭代器有点类似,但是与标准的PHP迭代器不同,PHP生成器不要求类实现Iterator接口,从而减轻了类的开销和负担。生成器会根据需求每次计算并产出需要迭代的值,这对应用的性能有很大的影响:试想假如标准的PHP迭代器经常在内存中执...

Java多线程 -yield用法

 前几天复习了一下多线程,发现有许多网上讲的都很抽象,所以,自己把网上的一些案例总结了一下!  一. Thread.yield( )方法:  使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次中不会执行到了。 ...

windows线程yield以及Sleep(0)和SwitchToThread之间的区别

C++的自定义线程函数内调用了一个自定义的yield()接口。 在windows上是调用了SwitchToThread来实现的,linux是pthread_yield实现的。 Sleep(0):时间片只能让给优先级相同或更高的线程; SwitchToThread():只要有可调度线程,即便优先级较低,也会让其调度。 下面是MSDN上对Sleep函数的描述:...