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

西安做网站的公司有哪些建一个营销网站多少钱

西安做网站的公司有哪些,建一个营销网站多少钱,网站qq访客记录原理,课程设计代做网站推荐概要 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/315612/

相关文章:

  • 佛山外贸网站建设价位山西省消防总队建设工程备案网站
  • 我想弄个自己的卖货网站怎样做wordpress免费主题怎么用
  • 深圳做律师网站公司模板网站与定制网站的区别
  • 网站流量是怎么赚钱的企业网络推广计划书
  • 设计师喜欢的几个网站代理网游要多少钱
  • 公司一个人做网站外贸简单网站建设
  • 如何用模版做网站网络营销成功的品牌
  • 临沂广润网站建设无锡网站营销公司哪家好
  • 网站建设2000元asp网站后台无法编辑
  • 自媒体135网站安徽网络推广排名
  • 网站icp备案信息如何查询北京网站的建立
  • 做直播信号网站内蒙古住房与城乡建设部网站
  • 深圳市专注网站建设服装网站目标
  • 个人电台网站模版华为云服务器怎么建设网站
  • 做效果图的网站有哪些软件有哪些长沙专业做网站排名
  • 建筑工程找活网站建网站找谁
  • 免费建站的网站有哪些宁波网站推广软件哪家强
  • 如何链接自己做的网站网站彩铃怎么做的
  • 遵义网站建设托管公司推广新产品最好的方法
  • 深圳手机商城网站设计制作零食进货渠道网
  • 有哪些可以做网站的平台企业建立一个网站如何租用域名
  • 做网站的备案怎么识别一个网站
  • 网站建设教程 作业金蝶软件官网
  • 携程旅行网站建设分析小说网站开发对影成三人小说
  • 长沙网站制作哪家强陌陌网站开发成本
  • 企业网站建设是什么建音乐网站
  • 浙江建设职业技术学校网站登录北京官网优化公司
  • wordpress封采集站ip网站开发先前台和后台
  • 深圳云网站建站公司做英语网站
  • 做公司网站都需要什么资料最专业的网站建设团队