Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析

Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析

二:linq的分区操作

常用的分区操作:Take,TakeWhile,Skip,SkipWhile

三:Take

1. 注释: 从序列的开头返回指定数量的连续元素

2. 实战:
var nums = new int[] { 10, 20, 30, 40, 50, 60 };

var query = nums.Take(2).ToList(); // 10,20

3. 探究源码:

四:TakeWhile

1. 注释: 只要满足指定的条件,就会返回序列的元素。 【find】

2. var nums = new int[] { 10, 20, 30, 40, 50, 60 };

var query = nums.TakeWhile(i => i < 20);

3. 大家要记住,TakeWhile和Where的区别在于,TakeWhile是从前往后计算,如果遇到不满足Func条件,则提前退出。

4. 源代码研究:

IL_0041: ldfld class [mscorlib]System.Func`2<!0, bool> class System.Linq.Enumerable/‘<TakeWhileIterator>d__26`1‘<!TSource>::predicate
IL_0046: ldloc.2
IL_0047: callvirt instance !1 class [mscorlib]System.Func`2<!TSource, bool>::Invoke(!0)
IL_004c: brfalse.s IL_0075

这里是在MoveNext中执行的,如果predicate为false,则直接退出。

五:Skip

1. 跳过序列中指定数量的元素,然后返回剩余的元素。

2.实战:

var nums = new int[] { 10, 20, 30, 40, 50, 60 };

var query = nums.Skip(3);

六:SkipWhile

大家一定要知道SkipWhile的灵活性是Skip的延伸。

static void Main(string[] args)
{
var nums = new int[] { 10, 20, 30, 40, 50, 60 };

var query = nums.SkipWhile(i => i < 30);

}

从linq中我们要知道,ILSpy和ILDasm是我们学习C#必备的两个工具。

时间: 2025-01-05 07:04:24

Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析的相关文章

Linq扩展最后遗留之SelectMany,Zip,SequenceEqual源码分析

Linq扩展最后遗留之SelectMany,Zip,SequenceEqual源码分析 一: AsParallel [并行化查询] 这个函数的功效就是将计算结果多线程化.[并行计算] =>[多核] 二:AsQueryable [将lambda表达式作为数据结构存储起来,Expresstion 表达式树] 三:Join 多表关联操作,我们可以用"查询关键字"解决. 为了更加的脱俗易懂,我们建议用人性化的"查询关键字"来解决这个复杂的Join,lambda. 四:

Linq特取操作之ElementAt,Single,Last,First源码分析

Linq特取操作之ElementAt,Single,Last,First源码分析 一:linq的特取操作 First/FirstOrDefault, Last/LastOrDefault, ElementAt/ElementAtOrDefault, Single/SingleOrDefault 二:First/FirstOrDefault 介绍 解释: 用于返回序列中的第一个值 异常: 如果当前集合没有值的话,如果你取第一个值,会抛出throw Error.NoElements();异常. pu

S5PV210-uboot源码分析-第一阶段

uboot源码分析1-启动第一阶段 1.starts.S是我们uboot源码的第一阶段: 从u-boot.lds链接脚本中也可以看出start.S是我们整个程序的入口处,怎么看出的呢,因为在链接脚本中有个ENTRY(_start)声明了_start是程序的入口.所以_start符号所在的文件,就是我们整个程序的起始文件,_start所在处的代码就是我们整个程序的起始代码. 2.我们知道了程序的入口是_start这个符号,但是却不知道是在哪一个文件中,所以要SI进行查找搜索,点击SI的大R进行搜索

SDL2源码分析5:更新纹理(SDL_UpdateTexture())

===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源码分析2:窗体(SDL_Window) SDL2源码分析3:渲染器(SDL_Renderer) SDL2源码分析4:纹理(SDL_Texture) SDL2源码分析5:更新纹理(SDL_UpdateTexture()) SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy()) SDL2源

Android应用setContentView与LayoutInflater加载解析机制源码分析

[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1 背景 其实之所以要说这个话题有几个原因: 理解xml等控件是咋被显示的原理,通常大家写代码都是直接在onCreate里setContentView就完事,没怎么关注其实现原理. 前面分析<Android触摸屏事件派发机制详解与源码分析三(Activity篇)>时提到了一些关于布局嵌套的问题,当时没有深入解释. 所以接下来主要分析的就是View或者ViewGroup对象是如何添加至应用程

转:Mongodb源码分析之Replication模式

原文出处:http://www.cnblogs.com/daizhj/archive/2011/06/13/mongodb_sourcecode_rep mongodb中提供了复制(Replication)机制,通过该机制可以帮助我们很容易实现读写分离方案,并支持灾难恢复(服务器断电)等意外情况下的数据安全. 在老版本(1.6)中,Mongo提供了两种方式的复制:master-slave及replica pair模式(注:mongodb最新支持的replset复制集方式可看成是pair的升级版,

FastText总结,fastText 源码分析

文本分类单层网络就够了.非线性的问题用多层的. fasttext有一个有监督的模式,但是模型等同于cbow,只是target变成了label而不是word. fastText有两个可说的地方:1 在word2vec的基础上, 把Ngrams也当做词训练word2vec模型, 最终每个词的vector将由这个词的Ngrams得出. 这个改进能提升模型对morphology的效果, 即"字面上"相似的词语distance也会小一些. 有人在question-words数据集上跑过fastT

Android视图View绘制流程与源码分析(全)

来源:[工匠若水 http://blog.csdn.net/yanbober] 1 背景 还记得前面<Android应用setContentView与LayoutInflater加载解析机制源码分析>这篇文章吗?我们有分析到Activity中界面加载显示的基本流程原理,记不记得最终分析结果就是下面的关系: 看见没有,如上图中id为content的内容就是整个View树的结构,所以对每个具体View对象的操作,其实就是个递归的实现. 前面<Android触摸屏事件派发机制详解与源码分析一(

jquery源码分析(二)——结构

再来复习下整体架构: jQuery源码分析(基于 jQuery 1.11 版本,共计8829行源码) (21,94)                定义了一些变量和函数jQuery=function(){} (96,280)        给jQuery添加一些方法和属性,jQuery.fn=jQuery.prototype(285,347)        extend:        jQuery的一些继承方法        更容易进行后续的扩展