那么,到底什么时候使用IQueryable,什么时候使用IEnumerable?...in orders) { Console.WriteLine("OrderId:" + order.OrderID); } } 通过vs的Intellisense我们可以看到Where的返回类型为...var order in orders) { Console.WriteLine("OrderId:" + order.OrderID); } } 这段代码的不同在于我们将LINQ的查询返回...IEnumerable类型,我们看一下vs的Intellisense效果: ?...由于我们在LINQ查询的时候加上了AsEnumerable(),因此我们在第二条语句能看到返回类型已经变为IEnumerable,参数也变成了Func类型。
关于NSubstitute的更详细信息请往 NSubstitute完全手册索引。 NSubstitute 已经发布2.0 RC版本支持.NET Core。...引入NSubstitute 相关nuget包: ?...我们可以告诉被创建的替代实例,当方法被调用时返回一个值: [Fact] public void Test_GetStarted_ReturnSpecifiedValue() ...的更详细信息请往 NSubstitute完全手册索引。...await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObjectIEnumerable
这节讲一下接口IEnumerable。 01 什么是Enumerable 在一些返回集合数据的接口中,我们经常能看到IEnumerable接口的身影。那什么是Enumerable呢?...也就是说通过枚举我们可以获取一个枚举器,通过枚举器我们能找到一个个数据对象,明白了这一点,我们就能大体上了解如何通过IEnumerable来获取数据了,那下面请看代码: 代码中有一个返回IEnumerable...的方法,用来模拟数据的产生,其中用到了一个yield关键字,我简单来说yield return就是部分返回(产生了一个数据,就返回一个,yield具体用法请看我上一篇分享的文章:[C#....NET 拾遗补漏] 理解 yield 关键字),这个方法最终的运行效果就是一秒钟返回一个当前时间构成一个IEnumerable集合。...:是先叫人,人到了,才能打疫苗),该方法返回bool值,有数据可寻则返回true,无数据则返回false,这就是循环的关键,运行结果跟上图一致,此处不再展示。
Nsubstitute是一个开源的框架,源码是C#实现的。...你可以在这里获得它的源码:https://github.com/nsubstitute/NSubstitute NSubstitute 更注重替代(Substitute)概念。...NSubstitute 采用的是Arrange-Act-Assert测试模式,你只需要告诉它应该如何工作,然后断言你所期望接收到的请求,就大功告成了。...园子里Dennis Gao 的 《NSubstitute完全手册》 非常不错,推荐深入阅读。
下面内容摘自上面第4篇博客,非本人原创: 那么什么时候用IQueryable,什么时候用IEnumerable?...我们需要将表达式组合好,然后再一起提交到数据库执行,返回查询结果。...(每次在执行where查询操作符的时候IQueryProvider会为我们创建一个新的IQueryable,调用AsEnumerable()方法的时候并不会去实际取值,只是 得到了一个IEnumerable...,所以EF在查询数据时候不要先取IEnumerable再去筛选数据。...(4) IEnumerable接口是一个公开枚举器,该枚举器支持在指定的集合上进行简单迭代,也就是次接口可以直接使用foreach遍历次Object。 ?
为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正文。...其中IEnumerable只有一个返回IEnumerator的GetEnumerator方法。而IEnumerator中有两个方法加一个属性。...所以要可以foreach只需要对象定义了GetEnumerator无参方法,并且返回值是IEnumerator或其对应的泛型。细看下图: ? 也就是说,只要可以满足这三步调用即可。...现在我想可以回答你“为什么Linq to Object中要返回IEnumerable?”: 因为IEnumerable是延迟加载的,每次访问的时候才取值。...执行到MyWhere的时候什么动作都没有(返回的就是IEnumerable),只有执行到ToList的时候才代码才真正的去遍历筛选。 这里的MyWhere其实可以用扩展方法来实现,提升逼格。
IEnumerable是所有可迭代非范型类的基础接口。IEnumerable包括一个方法GetEnumerator方法,方法返回一个IEnumerator。...Current一直返回相同的元素直到调用了MoveNext或者Reset方法。MoveNext将Current推进到下一个元素。...如果MoveNext之后position超出了集合的范围,MoveNext将返回false。 通过调用Reset将Current重置到第一个元素之前。...被遍历的类通过实现IEnumerable接口和实现一个IEnumerator枚举器实现遍历功能。...this.firstName = firstName; this.lastName = lastName; } } public class People : IEnumerable
this.lastName = lName; } public string firstName; public string lastName; } public class People : IEnumerable...经常被问到对IEnumerable和IEnumerator的认识。。。 也一直知道是为了实现迭代、foreach... 那么到底是干什么的呢?...IEnumerable里就一个方法,返回IEnumerator类型的对象; public IEnumerator GetEnumerator() IEnumerator里有三个方法需要实现。
/// 需要复制的数据长度 /// public static IEnumerable... Copy(this IEnumerable iEnumberable, int startIndex, int length) { var sourceArray..., newArray, 0, length); return newArray; } /// /// 给IEnumerable.../// /// public static IEnumerable...IEnumerable> Chunk(this IEnumerable source, int chunkSize) { return source
我们先去看看公开的.Net4.0的源程序中IEnumerable、IEnumerable、IEnumerator和IEnumerator这四个接口是如何声明的: 需加微信交流群的,请加小编微信号...public interface IEnumerable : IEnumerable { new IEnumerator GetEnumerator();...迭代器工作的原理是:先调用MoveNext()方法,然后读取Current得到元素,直到MoveNext返回false。 我们需要3个字段分别放置 元素的位置、元素、元素集。...返回元素。(好像有装箱的行为) 第三,在MoveNext方法内累加索引,并从元素集中读取元素。然后让索引值超出元素集返回个false值。...通过观察,发现迭代器主要就是返回一个元素对象,而StudentColletion里面的students元素集是List的,本身就能枚举,我们能不能利用这个不用专门写迭代器来实现枚举呢?
什么是IEnumerable? IEnumerable及IEnumerable的泛型版本IEnumerable是一个接口,它只含有一个方法GetEnumerator。...如何实现一个继承IEnumerable的类型? 实现一个继承IEnumerable的类型等同于实现方法GetEnumerator。...实现方法GetEnumerator GetEnumerator方法需要一个IEnumerator类型的返回值,这个类型是一个接口,所以我们不能这样写: return new IEnumerator();...yield只返回,不赋值 下面这个例子来自http://www.cnblogs.com/artech/archive/2010/10/28/yield.html#!comments。...从编译后的代码我们发现,只要我们通过foreach迭代一个IEnumerable,我们就会跑到GetVectors方法中,而每次运行GetVectors方法,yield都只会返回全新的三个值为(1,1)
本篇将围绕 《试试IEnumerable的10个小例子》和《试试IEnumerable的另外6个小例子》给出的例子,总结一下对于IEnumerable接口的一些使用方法,希望读者能够从中获得一些启发。...IEnumerable及其泛型版本IEnumerable定义了一个类型的“可迭代性”。这点很容易理解,系统中的很多集合类型都实现了该接口。 因此这些集合类型均可以采用foreach进行迭代遍历。...ConcurrentDictionary和Dictionary在迭代时的线程安全性是不同的,因为针对线程安全的设计是不同的 BlockingCollection.GetConsumingEnumerable方法返回一个会产生阻塞的消费者对象...建议读者在使用框架中实现了IEnumerable的类型时,一定要注意迭代的细节,可以通过MSDN上的文档了解其特殊性。...在《试试IEnumerable的另外6个小例子》中关于树的几个例子便数据此类中。
我正在开发具有“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...IEnumerableIEnumerable> Batch( this IEnumerable source, int size) { T[] bucket
IEnumerable 接口是 C# 开发过程中非常重要的接口,对于其特性和用法的了解是十分必要的。本文将通过6个小例子,来熟悉一下其简单的用法。...阅读建议 在阅读本篇时,建议先阅读前篇《试试IEnumerable的10个小例子》,更加助于读者理解。 阅读并理解本篇需要花费5-10分钟左右的时间,而且其中包含一些实践建议。
替代作为返回类型 IQueryable 通过IndexOf IEnumerable 从远端获得筛选之后的资料,和IEnumerable不同,IQueryable返回所有资料然后才进行筛选...:小结 IEnumerable及其泛型版本是所有集合的基础。...IEnumerable是迭代器模式的实现。 通常将迭代中拿出来的元素称为iterator。 实现IEnumerable接口,必须实现它唯一的方法GetEnumerator。...方法GetEnumerator返回一个IEnumerator类型的输出。...IEnumerable是整个LINQ的基础。整个LINQ都基于IEnumerable的扩展方法之上。C#大部分数据结构都实现了IEnumerable。
IEnumerable分为两个版本:泛型的和非泛型的。IEnumerable只有一个方法GetEnumerator。...如果你只需要数据而不打算修改它,不打算为集合插入或删除任何成员(例如从远端拿回数据显示),则你不需要任何比IEnumerable更复杂的接口。 ICollection继承IEnumerable。...IEnumerable的派生类:小结 访问特定位置的成员方式 继承自 特点 IEnumerable 通过ElementAt 无 有泛型版本 提供遍历(通过GetEnumerator) 不能实例化(...所有接口都是如此) ICollection 通过ElementAt IEnumerable 有泛型版本 提供Count方法 提供转换为IQueryable方法 ArrayList 索引器 IList
3.2 关于NSubstitute隔离框架 Nsubstitute是一个开源的框架,源码是C#实现的。...你可以在这里获得它的源码:https://github.com/nsubstitute/NSubstitute NSubstitute 更注重替代(Substitute)概念。...NSubstitute 采用的是Arrange-Act-Assert测试模式,你只需要告诉它应该如何工作,然后断言你所期望接收到的请求,就大功告成了。...3.3 使用NSubstitute模拟对象 NSub是一个受限框架,它最适合为接口创建伪对象。...3.4 使用NSubstitute模拟值 如果接口的方法返回不为空,如何从实现接口的动态伪对象返回一个值呢?
表示的Vector列表,而方法通过yield关键字返回三个Vectior对象。...在Main方法中,将GetVetors方法的返回值赋值给一个变量,然后对每一个Vector对象的X和Y进行重新赋值,最后将每一个Vector的信息输出来。...vector); 19: } 20: } 21: } 22: 23: 从上面的代码我们可以看到,通过yield关键字实现的GetVectors方法最终返回值是一个...同样是对于我们的例子,我们在对GetVectors方法的返回值进行变量赋值的时候的调用ToArray或者ToList方法,我们就能对元素进行有效赋值。...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.../// public static IList ToSelectListItem(this IEnumerable
我想要反转一个枚举,但是代码审查没过,这是为什么 在 C# 里面可以使用 IEnumerable 表示枚举值,而我提供了一个库给小伙伴用,这个库包含了这个方法,需要在某个不知道从哪里来的枚举值进行反转然后处理业务...小伙伴说代码审查没过,原因是在他的设备上一运行就占用了 100G 的内存 我写的代码也很简单 private static void Foo(IEnumerable list...虽然反转一个枚举可以使用 Reverse 方法,很方便,但是这个方法需要先将值进行 ToArray 然后再反转 而小伙伴可以通过下面代码写出一个有无限大的数组请看代码 private static IEnumerable...WarellereleKeneaberecembe().Reverse()) { } } private static IEnumerable...while (true) { yield return 0; } } 在想要写出 IEnumerable