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

网站如何做引流东莞seo培训

网站如何做引流,东莞seo培训,网站内如何@,阳江市人才招聘网概要 本文主要分析Linq中Take带Range参数的重载方法的源码。对于其中的一些关于Range或序列的新概念,不再赘述,请参看C# Linq源码分析之Take (一) 源码分析 基于Range参数的Take重载方法,主要分成两部分实现&#x…

概要

本文主要分析Linq中Take带Range参数的重载方法的源码。对于其中的一些关于Range或序列的新概念,不再赘述,请参看C# Linq源码分析之Take (一)

源码分析

基于Range参数的Take重载方法,主要分成两部分实现,一部分是Range中的开始和结束索引都是正数的情况例如取第一个到第三个元素的情况;另一部分是开始或结束索引中有倒数的情况,例如取倒数第三个到倒数第一个的情况。

本文着重分析Range中的正数情况。

public static IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource> source, Range range)
{if (source == null){    ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);}Index start = range.Start;Index end = range.End;bool isStartIndexFromEnd = start.IsFromEnd;bool isEndIndexFromEnd = end.IsFromEnd;int startIndex = start.Value;int endIndex = end.Value;Debug.Assert(startIndex >= 0);Debug.Assert(endIndex >= 0);if (isStartIndexFromEnd){if (startIndex == 0 || (isEndIndexFromEnd && endIndex >= startIndex)){return Empty<TSource>();}}else if (!isEndIndexFromEnd){return startIndex >= endIndex? Empty<TSource>(): TakeRangeIterator(source, startIndex, endIndex);}return TakeRangeFromEndIterator(source, isStartIndexFromEnd, startIndex, isEndIndexFromEnd, endIndex);
}
  1. 检查源序列是否为空,如果为空,直接抛出异常;
  2. 获取Range的启始和结束的索引值,以及索引值是正数还是倒数的bool值;
  3. 如果开始索引值是倒数,以下几种情况返回空序列:
    (a)开始索引是^0, 倒数第0个,显然不合理
    (b)Range形如 ^1… ^3的情况,假设有10个元素, ^1… ^3相当于取从第10个到第7个,显然是不合理。应该是从第7个到第10个
    (c)Range形如 ^2 … ^2因为开始和结束索引相同,中间没有间隔元素,该种情况也不合理
  4. 在Range中的开始和结束索引都不是倒数的情况下,如果开始索引大于结束索引,即Range形如2…1,返回空序列;否则调用TakeRangeIterator方法,完成具体取值操作;
  5. 对于合理的Range倒数情况,例如形如 ^3… ^1 , 3… ^1 或 ^3 … 10 这些情况,执行最后的TakeRangeFromEndIterator方法。

TakeRangeIterator方法

TakeRangeIterator方法用于处理Range中的开始和结束索引都是正数的情况。该方法位于Take.SizeOpt文件中。通过yield return/break的方式管理迭代过程。

private static IEnumerable<TSource> TakeRangeIterator<TSource>(IEnumerable<TSource> source, int startIndex, int endIndex)
{Debug.Assert(source != null);Debug.Assert(startIndex >= 0 && startIndex < endIndex);using IEnumerator<TSource> e = source.GetEnumerator();int index = 0;while (index < startIndex && e.MoveNext()){++index;}if (index < startIndex){yield break;}while (index < endIndex && e.MoveNext()){yield return e.Current;++index;}
}
  1. 创建迭代器e,采用using方式,在函数执行完成后,自动释放内存空间;
  2. 如果Range中的索引数据和source序列中的元素个数不匹配,例如指定从第三个元素开始取,但是数列里面只有两个元素,返回yield break,关闭状态机,注意,此种情况并不会抛出越界异常;
  3. 按照索引范围,通过迭代器e取值,创建状态机,通过yield return方式返回。

TakeRangeFromEndIterator方法

TakeRangeIterator方法用于处理Range中的开始和结束索引存在倒数的情况。该方法位于Take.cs文件中。通过yield return/break的方式管理迭代过程。

该方法篇幅较长,将在C# Linq源码分析之Take (三)中详细分析其源码。

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

相关文章:

  • 做抽奖网站违法吗郑州做网站和app的公司
  • 火狐 开发者 网站公司网站上传文章
  • 购物帮做特惠的导购网站秦皇岛网站制作 微商城建设
  • 冠县做网站推广互联网政务服务平台
  • 旅游管理网站业务模块济南seo网站建设
  • 惠州网站设计培训专业建设质量报告
  • 建网站视频wordpress规则
  • 0网站建设公司宣传册wordpress英文字体样式
  • 太原seo外包服务淘宝seo搜索优化
  • 商务网站制作工程师成都科技网站建设电话多少
  • 深圳制作网站公司中国诚乡建设部网站
  • 沈阳市营商环境建设监督局网站建设工程合同有哪些种类
  • 做网站灵宝狍与女人做爰网站
  • wordpress目录分站比较有名的网站建设公司
  • 在哪个网站做一照一码宝安区建设网站
  • 网站添加悬浮二维码上海网站建设 s
  • 网站建设表格便民平台推广怎么做
  • 网站建设get你装饰网站建设专家
  • 怎么介绍自己做的电影网站吗珠海做网站设计服务好
  • 网站这么做优化维护网址
  • 展展示型网站开发百度下载app下载
  • 网站建设公司成都做电影网站还是国外服务器
  • 龙岩网站制作设计网站需求分析报告
  • 网站建设公司好吗用c 做的网站怎么打开
  • 常州制作企业网站网页游戏交易平台有哪些
  • wordpress小红心插件网站优化怎样做
  • 设计师万能导航网站健身餐的网站怎么做
  • 青岛网站建设服务公司良乡网站建设公司
  • 最受欢迎国内设计网站南宁百度seo推广
  • 自己做网站不如帮别人做运营网站备案授权码