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

免费注册域名的网站网站建设佳木斯

免费注册域名的网站,网站建设佳木斯,北京排名seo优化渠道,wordpress图片重命名概要 本文主要分析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/944978/

相关文章:

  • 上海微信网站盐都建设局网站
  • jsp网站开发实训本科学院网站建设方案
  • 35网站建设html网站二维码悬浮怎么做
  • 大连做网站团队加强政协网站建设
  • 发布asp.net网站到虚拟主机淘城汇网站谁做的
  • 锦州网站建设最低价阿里企业邮箱费用
  • 做视频网站软件电脑网站首页设计
  • 社交网站开发流程wordpress 网站关键词
  • 网站如何设置二级域名贵金属如何用网站开发客户
  • 建设网站需要多久网络营销方案300字
  • 比较好的营销网站电子购物网站
  • 福州网站建设设计公司魏县住房和城乡建设局网站
  • 鹤壁网站建设费用网站建设技术难点
  • 在手机上做网站是什么软件企业平台是什么意思
  • 长沙出名的网站设计推广佛山顺德网站建设公司哪家好
  • 代还信用卡网站建设网站建设硬件环境
  • 铜陵app网站做招聘信息常见的简单的网站制作
  • 内蒙古建网站建设设计院网站
  • 如何做京东商城一样的网站古典风网站
  • 网站模板怎样发布公司网站友情链接
  • 上海网站建设在哪福州网站开发cms
  • 西安网站制作开发网站诊断网站seo诊断
  • 网站开发端口查询专业建站公司服务
  • 新手学做免费网站怎么自己做网站的推广
  • 淘宝网站是哪个公司做的广东建设信息网三类人
  • 物流网站建设策划书的总结国外卖货平台有哪些
  • 用表格做的网站阿里巴巴网站优化怎么做
  • 谷歌网站地图生成器网站浮动窗口代码
  • 在线相册jsp网站开发与设计工信部网站备案查询 验证码
  • 网站建设有什么价值站长seo