当前位置: 首页 > news >正文

国家城乡住房建设部网站首页百度站长联盟

国家城乡住房建设部网站首页,百度站长联盟,关键词优化的原则,天津机械网站建设模板概要 Take方法作为IEnumerable的扩展方法,具体对应两个重载方法。本文主要分析第一个接收整数参数的重载方法。 源码解析 Take方法的基本定义 public static System.Collections.Generic.IEnumerable Take (this System.Collections.Generic.IEnumerable source…

概要

Take方法作为IEnumerable的扩展方法,具体对应两个重载方法。本文主要分析第一个接收整数参数的重载方法。

源码解析

Take方法的基本定义

public static System.Collections.Generic.IEnumerable Take (this System.Collections.Generic.IEnumerable source, int count);

基本功能是从序列source中,返回指定个数count的相邻元素。

源码分析

Take.cs

public static IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource> source, int count)
{if (source == null){ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);}return count <= 0 ?Empty<TSource>() :TakeIterator<TSource>(source, count);
}

Take方法本身代码很简单, 首先作了一个空序列的检查,如果序列为空,则抛出异常。然后如果count是0,即取前0项相邻元素,等价于什么也不作,直接返回,否则调用TakeIterator方法。

Take.SizeOpt.cs

private static IEnumerable<TSource> TakeIterator<TSource>(IEnumerable<TSource> source, int count)
{Debug.Assert(count > 0);foreach (TSource element in source){yield return element;if (--count == 0) break;}
}

TakeIterator方法并没有像我们之前分析的Where,Select等方法那样,根据功能,定于很多Iterator的派生类来实现具体的功能,而是使用了yield return的方式。

按照count的个数取出对应的元素,以yield return的方式返回。

下面我们使用相同的代码,定义我们自己的扩展方法take 和takeIterator,通过log来搞清楚yield return方式的实现细节。

 public static IEnumerable<TSource> take<TSource>(this IEnumerable<TSource> source, int count)
{Console.WriteLine("take is called !");if (source == null){             ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);}return count <= 0 ?Empty<TSource>() :takeIterator<TSource>(source, count);
}private static IEnumerable<TSource> takeIterator<TSource>(IEnumerable<TSource> source, int count)
{Console.WriteLine("TakeIterator is called !");Debug.Assert(count > 0);foreach (TSource element in source){Console.WriteLine("Enter takeIterator Foreach");yield return element;Console.WriteLine("Return " + element + " from takeIterator Foreach");if (--count == 0) break;}
}

Case 1 不通过toList或foreach循环来调用take的返回值。

  static void Main(string[] args){var list = Enumerable.Range(1,10).take(2);}

执行结果如下:

在这里插入图片描述
我们可以看到takeIterator并未被调用。

Case 2: 通过foreach循环来调用take的返回值

static void Main(string[] args){var list = Enumerable.Range(1,10).take(2);foreach (var item in list){Console.WriteLine("Enter foreach Main function's  foreach");Console.WriteLine("Print " + item + " in Main function");}}

执行结果如下:

在这里插入图片描述
从执行结果可以看出:

  1. takeIterator函数只执行一次,但是会生成一个状态机,用于返回take出来的所有数据;
  2. Main函数中的foreach每次的取值,是从状态机中获取数据,即通过yield return的方式获取。

结论

通过定义具体迭代器实现的延迟加载和通过yield return方式实现的延迟加载,本质上没有区别。

但是实现上略有不同,定义迭代器方式实现的Where或Select等方法,如果没有取值操作,它只是将迭代器对象返回,迭代器对象中保存了迭代方式和源数据序列,对应的方法会被调用。通过yield return方式实现的迭代器,如果没有取值操作,yield return所在的方法不会被调用。

http://www.yayakq.cn/news/118725/

相关文章:

  • html5官方网站开发流程阿里云大使wordpress
  • 网站关联词搜索怎么做游戏网页制作
  • 营销自己的网站公司做网站的钱网银转账用途
  • 合肥手机网站制作池州网站建设开发
  • 网站页面的大小写seo顾问咨询
  • 网站项目开发流程推广网站seo
  • 做网站分几种wordpress dux5.3
  • 手机网站seo优化做网站售后几年
  • 买做指甲的材料在哪个网站宜昌建设厅网站
  • 电气网站模板为什么打不开中国建设银行网站
  • 网页浏览加速器如何给网站做关键词优化
  • 百度网站安全在线检测优化百度搜索
  • 专业网站制作公司案例百度搜索引擎竞价排名
  • 沂南县建设局网站百度高级搜索功能
  • 大型外贸商城网站建设小游戏网站
  • 西宁摄网站制作2023房地产最新消息
  • 企业网站优化之如何做需求分析网站模板备份
  • 网站建设高清图外贸高端网站开发
  • 吉首网站建设吉首网站建设wordpress 作者 英文
  • 建站saas如何制作网页小游戏
  • 设计素材网站能挣钱吗北京pk10盘制作网站建设
  • 网站 内容 营销广州3d建模培训机构
  • 三九手机网手机响应式网站模版品牌建设对企业的发展的作用
  • 网站联盟的收益模式南京建设教育网站
  • 盐城公司做网站微信营销课
  • 自己编程做网站深圳网站制作公司兴田德润官网多少
  • 网站建设 .影响力科技网站后台发布新闻
  • 招商网站建设运营加强门户网站建设 信息公开
  • 网站建设行业发展趋势erp软件多少钱一套
  • 哪里有营销型网站公司wordpress更换编辑器