LINQ查询方法一共提供了两种扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable接口的集合进行扩展;Queryable类,针对继承了...我们会发现接口IQueryable实际也是继承了IEnumerable接口的,既然这样微软为什么要设计出两套扩展方法呢?...针对LINQ to SQL时,则使用Queryable中的扩展方法,它接受的是Expression。 那么,到底什么时候使用IQueryable,什么时候使用IEnumerable?...LINQ的查询返回IEnumerable类型,我们看一下vs的Intellisense效果: ?...由于我们在LINQ查询的时候加上了AsEnumerable(),因此我们在第二条语句能看到返回类型已经变为IEnumerable,参数也变成了Func类型。
这节讲一下接口IEnumerable。 01 什么是Enumerable 在一些返回集合数据的接口中,我们经常能看到IEnumerable接口的身影。那什么是Enumerable呢?...02 接口成员及使用示例 我们先来看接口中有什么,因为IEnumerable接口一般都是用其泛型版,我们直接看这种: 接口内容很简单,但是其中又出现了一个名为IEnumerator的接口...NET 拾遗补漏] 理解 yield 关键字),这个方法最终的运行效果就是一秒钟返回一个当前时间构成一个IEnumerable集合。...foreach就是为遍历IEnumerable数据打造的,它里边为我们封装了访问枚举器的操作,所以我们用它来遍历数据非常方便,下面来看一下运行效果: 当然,我们也想知道不用foreach应该怎么遍历...IEnumerable数据,所以请看如下代码: 拿到枚举器,我们就可以调用MoveNext找数据(为什么要先调用MoveNext,而不是先取值,再调用MoveNext寻找下一个数据,大家可以再次联想一下打疫苗的情景
下面内容摘自上面第4篇博客,非本人原创: 那么什么时候用IQueryable,什么时候用IEnumerable?...(每次在执行where查询操作符的时候IQueryProvider会为我们创建一个新的IQueryable,调用AsEnumerable()方法的时候并不会去实际取值,只是 得到了一个IEnumerable...,所以EF在查询数据时候不要先取IEnumerable再去筛选数据。...(解析表达式,然后执行取得结果)) 这就是IQueryable的延迟加载把. .知识点总结 (1) 解决查询多次的问题,因IQueryable延迟加载,当用到集合的时候,provider会解析表达式...(4) IEnumerable接口是一个公开枚举器,该枚举器支持在指定的集合上进行简单迭代,也就是次接口可以直接使用foreach遍历次Object。 ?
自己实现迭代器 yield的使用 怎样高性能的随机取IEnumerable中的值 我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件?...为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正文。...: 必须实现IEnumerable接口?NO ? 我们自己写的MyIEnumerable删掉后面的IEnumerable接口一样可以foreach(不信?自己去测试)。...不一定要继承于IEnumerable。有意思吧!下次面试官问你的时候一定要争个死去活来啊,哈哈!...现在我想可以回答你“为什么Linq to Object中要返回IEnumerable?”: 因为IEnumerable是延迟加载的,每次访问的时候才取值。
this.lastName = lName; } public string firstName; public string lastName; } public class People : IEnumerable...经常被问到对IEnumerable和IEnumerator的认识。。。 也一直知道是为了实现迭代、foreach... 那么到底是干什么的呢?...到目前为止,理解到:我定义一个类型(类),实例化了一系列对象,一般情况下,我们会放到一个List里,那么这个集合,是支持foreach操作的。...IEnumerable里就一个方法,返回IEnumerator类型的对象; public IEnumerator GetEnumerator() IEnumerator里有三个方法需要实现。...至于在应用中的具体应用,还没想到场景,希望您不吝赐教。
IEnumerable是所有可迭代非范型类的基础接口。IEnumerable包括一个方法GetEnumerator方法,方法返回一个IEnumerator。...IEnumerator是所有非范型迭代器的基础接口。foreach语句隐藏了C#迭代器的复杂实现。推荐使用foreach代替直接操作迭代器。 迭代器可以读取集合中的数据,但是不能从底层修改集合。...初始的时候,迭代器定位在集合的第一个元素前面,在读取Current值之前需要调用一次MoveNext将迭代器驱动到第一个元素的位置。...foreach是一种语法糖,简化了遍历其中的具体实现。...被遍历的类通过实现IEnumerable接口和实现一个IEnumerator枚举器实现遍历功能。
本篇将围绕 《试试IEnumerable的10个小例子》和《试试IEnumerable的另外6个小例子》给出的例子,总结一下对于IEnumerable接口的一些使用方法,希望读者能够从中获得一些启发。...框架类型的迭代 对于一个实现了IEnumerable接口的类型来说,开发中最常用的,就是把这个类型的对象放入到foreach等循环关键词中进行迭代,遍历其中的元素进行处理。...IEnumerable及其泛型版本IEnumerable定义了一个类型的“可迭代性”。这点很容易理解,系统中的很多集合类型都实现了该接口。 因此这些集合类型均可以采用foreach进行迭代遍历。...建议读者在使用框架中实现了IEnumerable的类型时,一定要注意迭代的细节,可以通过MSDN上的文档了解其特殊性。...这些数据结构的迭代通常需要特定算法的支持。 在《试试IEnumerable的另外6个小例子》中关于树的几个例子便数据此类中。
summary> public static class IEnumerableExtentions { /// /// 复制序列中的数据...typeparam> /// 原数据 /// 原数据开始复制的起始位置... /// 需要复制的数据长度 /// public...static IEnumerable Copy(this IEnumerable iEnumberable, int startIndex, int length)...> Chunk(this IEnumerable source, int chunkSize) { return source
什么是IEnumerable? IEnumerable及IEnumerable的泛型版本IEnumerable是一个接口,它只含有一个方法GetEnumerator。...如何实现一个继承IEnumerable的类型? 实现一个继承IEnumerable的类型等同于实现方法GetEnumerator。...而且会出现一个问题,就是你无法知道集合的大小(IEnumerable没有Count方法,只有IEnumerable才有)。...的缺点 IEnumerable功能有限,不能插入和删除。...访问IEnumerable只能通过迭代,不能使用索引器。迭代显然是非线程安全的,每次IEnumerable都会生成新的IEnumerator,从而形成多个互相不影响的迭代过程。
我们先去看看公开的.Net4.0的源程序中IEnumerable、IEnumerable、IEnumerator和IEnumerator这四个接口是如何声明的: 需加微信交流群的,请加小编微信号...2、继承接口IEnumerable: 当我们在类后面加上:IEnumerable后,Visual Studio IDE会冒出来一个小黄灯泡,点进去有提示自动填充接口的约定,我们选第一项实现接口(Visaul...,IDE会帮我们把SudentCollection改造成以下的: class StudentCollection:IEnumerable { public List<Student...答案是肯定的,我们这样写: class StudentCollection:IEnumerable { public List students = new...二、接口IEnumerable实现 如果我们想写一个通用的可foreach的类,用到泛型: class MyCollection { public List<
我正在开发具有“IEnumerable用户”的c#程序,其中存储了400万用户的ID。我需要遍历Ienummerable并每次提取一批1000个ID,以另一种方法执行一些操作。...我如何从Ienumerable的开始一次提取1000个ID ...做一些其他事情然后获取下一批1000个 可以使用linq morelinq库的 batch方法(可从NuGet获得): foreach(...IEnumerable batch in users.Batch(1000)) // use batch 如果简单使用库不是一种选择,则可以重新使用实现: public static...IEnumerable> Batch( this IEnumerable source, int size) { T[] bucket
IEnumerable 接口是 C# 开发过程中非常重要的接口,对于其特性和用法的了解是十分必要的。本文将通过6个小例子,来熟悉一下其简单的用法。...阅读建议 在阅读本篇时,建议先阅读前篇《试试IEnumerable的10个小例子》,更加助于读者理解。 阅读并理解本篇需要花费5-10分钟左右的时间,而且其中包含一些实践建议。...全是源码 以下便是这6个小例子,相应的说明均标记在注释中。...T14搜索树 若以下代码无法正常展示,也可以点击此处查看 T15分页 若以下代码无法正常展示,也可以点击此处查看 T16分页与多级缓存 若以下代码无法正常展示,也可以点击此处查看 源码说明 以上示例的源代码放置于博客示例代码库中
IEnumerable的直接继承者还有Stack和Queue。 所有标准的泛型集合都实现了ICollection。...IEnumerable的派生类:小结 访问方式 继承自 特点 IEnumerable 通过ElementAt 无 所有泛型集合都继承自此接口 有非泛型版本 提供遍历(通过GetEnumerator...IEnumerable替代作为返回类型 IQueryable 通过IndexOf IEnumerable 从远端获得筛选之后的资料,和IEnumerable不同,IQueryable...O(log n) O(log n) O(log n) 没有索引器 IEnumerable:小结 IEnumerable及其泛型版本是所有集合的基础。...IEnumerable是整个LINQ的基础。整个LINQ都基于IEnumerable的扩展方法之上。C#大部分数据结构都实现了IEnumerable。
IEnumerable分为两个版本:泛型的和非泛型的。IEnumerable只有一个方法GetEnumerator。...如果你只需要数据而不打算修改它,不打算为集合插入或删除任何成员(例如从远端拿回数据显示),则你不需要任何比IEnumerable更复杂的接口。 ICollection继承IEnumerable。...由于实现方式的特殊性,每个哈希表上的元素仅有一个可能出现的位置,就是其哈希函数的值加上冲突之后的调整偏移量,无法移动哈希表上的元素。 哈希表是一种键值对类型的数据结构。...IEnumerable的派生类:小结 访问特定位置的成员方式 继承自 特点 IEnumerable 通过ElementAt 无 有泛型版本 提供遍历(通过GetEnumerator) 不能实例化(...所有接口都是如此) ICollection 通过ElementAt IEnumerable 有泛型版本 提供Count方法 提供转换为IQueryable方法 ArrayList 索引器 IList
后记 一、一个很简单的例子 下面是一个很简单的例子:Vector为自定义表示二维向量的类型,Program的静态方法GetVetors方法获取以类型为IEnumerable...,实现的接口包括:IEnumerable, IEnumerable, IEnumerator, IEnumerator, IDisposable。...但是有的情况下,我们需要调用别人提供的API来获取IEnumerable对象,我们不清楚对方有没有使用yield关键字。...yield这个关键字如何如何,因为不止是yield,我们一般的LINQ查询也会导致这个问题,而是借此说明IEnumerable对象和Array、List这样的集合类型的区别。...IEnumerable这个接口和集合没有本质的联系,只是提供“枚举”的功能。甚至说,我们应该将IEnumerable对象当成“只读”的,如果我们需要“可写”的功能,你应该使用数组或者集合类型。
我想要反转一个枚举,但是代码审查没过,这是为什么 在 C# 里面可以使用 IEnumerable 表示枚举值,而我提供了一个库给小伙伴用,这个库包含了这个方法,需要在某个不知道从哪里来的枚举值进行反转然后处理业务...小伙伴说代码审查没过,原因是在他的设备上一运行就占用了 100G 的内存 我写的代码也很简单 private static void Foo(IEnumerable list...private static IEnumerable WarellereleKeneaberecembe() { while (true...while (true) { yield return 0; } } 在想要写出 IEnumerable...特别是在做库的时候,小伙伴会传入的值会挖坑,所以我推荐反转需要知道这是有限数组
正文 IEnumerable和IEnumerator,如果不仔细看,是不是都以为它们是同样的一个单词。特别是我们习惯了每天看大量的中文,这种只是很小区别的单词更是容易犯错。...好的,回到今天的主题:IEnumerable和IEnumerator。目前我们知道它俩是不一样的东西了,至少从单词层面(ง •_•)ง。那么在 DotNET 中,它们扮演着怎么样的角色呢?...先来看看它们的样子: ? ? IEnumerable说:我提供了公开枚举器,并且该枚举器支持在非泛型集合上进行简单迭代的功能。 IEnumerator说:我提供了支持对非泛型集合进行简单迭代的功能。...其实看接口的样貌我们就大概能够理解其中的奥秘了,IEnumerable 提供了可以迭代的能力,而这种能力是通过内部的可迭代对象来实现了,这个对象就是IEnumerator。...那我们就来查看IList的接口继承关系: public interface IList : ICollection, IEnumerable 果不其然,它继承了IEnumerable接口。
由于在MVC中经常会使用到@Html.DropDownList方法,而该方法接收的是List 参数,因此就想着写一个扩展方法,直接把IEnumerable转换为List<...public string Name { get; set; } public string Color { get; set; } } 2、编写扩展方法,把IEnumerable...namespace Common { public static class Extensions { /// /// 扩展方法,IEnumerable.../// /// /// 带转换的数据...Value"> /// /// 传递过来的SelectListItem
IEnumerator IEnumerator、IEnumerable接口有相似的名称,这两个接口通常也在一起使用,它们有不同的用途。...Current方法: 返回position位置的当前对象 IEnumerable IEnumerable接口为foreach迭代提供了支持,IEnumerable要求你实现GetEnumerator方法...仅凭以上辞藻,很难区分两个接口的使用场景。 IEnumerator接口定义对类中的集合类型对象的迭代方式, IEnumerable接口允许使用foreach循环进行枚举。...因此IEnumerable接口的GetEnumerator方法会返回一个IEnumerator接口。要实现IEnumerable,你还必须实现IEnumerator。...IEnumerable接口代表该对象具备了可被枚举的性质,是形容词。 总之,如果您想提供对foreach的支持,那么就先让对象可枚举,再谈论枚举方式,也就是说实现这两个接口。
List<Model.Template> templateList = templateBLL.RecommendTemplateByOrder(modelEb...
领取专属 10元无门槛券
手把手带您无忧上云