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

深圳 网站制作广告推广赚钱在哪接

深圳 网站制作,广告推广赚钱在哪接,网站开发公司组织架构,wap 网站 开发概要 本文主要分析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.hkea.cn/news/295739/

相关文章:

  • 最棒的网站建设考研最靠谱的培训机构
  • 广州建设企业网站黑河seo
  • 招商网站建设性价比高seo排名优化的
  • 产品网站怎么做的长沙正规关键词优化价格从优
  • 怎样查询江西省城乡建设厅网站杭州seo网
  • 网站建设空间是指什么软件网站优化最为重要的内容是
  • 做美工要开通什么网站的会员呢新网站友链
  • 网站集约化建设推进情况推广app赚钱
  • 番禺大石做网站域名污染查询网站
  • 长沙市在建工程项目免费seo快速排名工具
  • 南宁定制网站制作电话图片外链生成工具
  • 哪些网站做的海报比较高大上百度客服电话是多少
  • 菏泽网站建设电话常州seo外包
  • 做木皮的网站裂变营销五种模式十六种方法
  • 精美 企业网站模板微信软文推广怎么做
  • 怎么建立一个网站里面可以查询资料百度权重域名
  • 网站建设顺序镇江交叉口优化
  • 低价企业网站搭建软文新闻发布网站
  • 创造与魔法官方网站做自己喜欢的事seo视频
  • 淘宝联盟推广网站怎么做吉安seo招聘
  • 工程招聘网站如何免费制作自己的网站
  • 网站建设调研问卷搜易网托管模式的特点
  • 在哪个网站可以做java面试题宁德市蕉城区疫情
  • 2021年重大新闻事件seo快速工具
  • 拼多多网店南宁优化推广服务
  • 洛阳建筑公司排名长沙官网seo服务
  • 网站关键词优化公司哪家好企业网站seo点击软件
  • 做网站有必要?优化师培训
  • 网站怎么发布信息百度推广优化技巧
  • 西安软件培训百度百科优化排名