LINQ查询方法一共提供了两种扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerableT>接口的集合进行扩展;Queryable类,针对继承了...IQueryableT>接口的集合进行扩展。...我们会发现接口IQueryableT>实际也是继承了IEnumerableT>接口的,既然这样微软为什么要设计出两套扩展方法呢?...那么,到底什么时候使用IQueryableT>,什么时候使用IEnumerableT>?...现在我们应该知道何时使用IEnumerableT>,何时使用IqueryableT>。
这节讲一下接口IEnumerable。 01 什么是Enumerable 在一些返回集合数据的接口中,我们经常能看到IEnumerable接口的身影。那什么是Enumerable呢?...02 接口成员及使用示例 我们先来看接口中有什么,因为IEnumerable接口一般都是用其泛型版,我们直接看这种: 接口内容很简单,但是其中又出现了一个名为IEnumerator的接口...也就是说通过枚举我们可以获取一个枚举器,通过枚举器我们能找到一个个数据对象,明白了这一点,我们就能大体上了解如何通过IEnumerable来获取数据了,那下面请看代码: 代码中有一个返回IEnumerable...foreach就是为遍历IEnumerable数据打造的,它里边为我们封装了访问枚举器的操作,所以我们用它来遍历数据非常方便,下面来看一下运行效果: 当然,我们也想知道不用foreach应该怎么遍历...IEnumerable数据,所以请看如下代码: 拿到枚举器,我们就可以调用MoveNext找数据(为什么要先调用MoveNext,而不是先取值,再调用MoveNext寻找下一个数据,大家可以再次联想一下打疫苗的情景
下面内容摘自上面第4篇博客,非本人原创: 那么什么时候用IQueryable,什么时候用IEnumerable?...(每次在执行where查询操作符的时候IQueryProvider会为我们创建一个新的IQueryable,调用AsEnumerable()方法的时候并不会去实际取值,只是 得到了一个IEnumerable...,所以EF在查询数据时候不要先取IEnumerable再去筛选数据。...(4) IEnumerable接口是一个公开枚举器,该枚举器支持在指定的集合上进行简单迭代,也就是次接口可以直接使用foreach遍历次Object。 ?
为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正文。...: 必须实现IEnumerable接口?NO ? 我们自己写的MyIEnumerable删掉后面的IEnumerable接口一样可以foreach(不信?自己去测试)。...不一定要继承于IEnumerable。有意思吧!下次面试官问你的时候一定要争个死去活来啊,哈哈!...现在我想可以回答你“为什么Linq to Object中要返回IEnumerable?”: 因为IEnumerable是延迟加载的,每次访问的时候才取值。...结束: demo下载:http://pan.baidu.com/s/1dE94c1b 接下篇:《再讲IQueryableT>,揭开表达式树的神秘面纱》
this.lastName = lName; } public string firstName; public string lastName; } public class People : IEnumerable...经常被问到对IEnumerable和IEnumerator的认识。。。 也一直知道是为了实现迭代、foreach... 那么到底是干什么的呢?...到目前为止,理解到:我定义一个类型(类),实例化了一系列对象,一般情况下,我们会放到一个ListT>里,那么这个集合,是支持foreach操作的。...如果,我是说如果,我们不放在现有的集合里,而是放在一个数组里T[],那么如果我还想迭代之,如何做呢? 答案就是这两个东西:支持在非泛型集合上执行简单迭代。...IEnumerable里就一个方法,返回IEnumerator类型的对象; public IEnumerator GetEnumerator() IEnumerator里有三个方法需要实现。
IEnumerable是所有可迭代非范型类的基础接口。IEnumerable包括一个方法GetEnumerator方法,方法返回一个IEnumerator。...被遍历的类通过实现IEnumerable接口和实现一个IEnumerator枚举器实现遍历功能。...this.firstName = firstName; this.lastName = lastName; } } public class People : IEnumerable...{ _people[i] = pArray[i]; } } IEnumerator IEnumerable.GetEnumerator
T> CopyT>(this IEnumerableT> iEnumberable, int startIndex, int length) { var sourceArray..., newArray, 0, length); return newArray; } /// /// 给IEnumerable...(this IEnumerableT> iEnumberable, ActionT> func) { foreach (var item in iEnumberable...(this IEnumerableT> iEnumberable, ActionT, int> func) { var array = iEnumberable.ToArray...IEnumerableT>> ChunkT>(this IEnumerableT> source, int chunkSize) { return source
我们先去看看公开的.Net4.0的源程序中IEnumerableT>、IEnumerable、IEnumeratorT>和IEnumerator这四个接口是如何声明的: 需加微信交流群的,请加小编微信号...public interface IEnumerableT> : IEnumerable { new IEnumeratorT> GetEnumerator();...} public interface IEnumeratorT> : IDisposable, IEnumerator { new T Current {...二、接口IEnumerableT>实现 如果我们想写一个通用的可foreach的类,用到泛型: class MyCollectionT> { public ListT> mycollection = new ListT>(); public void Add(T value) { mycollection.Add
什么是IEnumerable? IEnumerable及IEnumerable的泛型版本IEnumerableT>是一个接口,它只含有一个方法GetEnumerator。...Enumerable这个静态类型含有很多扩展方法,其扩展的目标是IEnumerableT>。...实际上下面两段代码的作用是相同的: foreach (T item in collection) { ... } IEnumeratorT> enumerator = collection.GetEnumerator...(); while (enumerator.MoveNext()) { T item = enumerator.Current; ... } 注意:第二段代码中,没有呼叫Reset方法,也不需要呼叫...而且会出现一个问题,就是你无法知道集合的大小(IEnumerable没有Count方法,只有IEnumerableT>才有)。
本篇将围绕 《试试IEnumerable的10个小例子》和《试试IEnumerable的另外6个小例子》给出的例子,总结一下对于IEnumerable接口的一些使用方法,希望读者能够从中获得一些启发。...IEnumerable及其泛型版本IEnumerableT>定义了一个类型的“可迭代性”。这点很容易理解,系统中的很多集合类型都实现了该接口。 因此这些集合类型均可以采用foreach进行迭代遍历。...建议读者在使用框架中实现了IEnumerable的类型时,一定要注意迭代的细节,可以通过MSDN上的文档了解其特殊性。...在《试试IEnumerable的另外6个小例子》中关于树的几个例子便数据此类中。...例如在将本地函数、IEnumerable和Task相结合的 T10测试网络连接 中。这种写法就减少了传统写法中需要创建一个List或者Array的开销。 总之,这种写法,提供了一种新的思路。
我正在开发具有“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...IEnumerableIEnumerableT>> BatchT>( this IEnumerableT> source, int size) { T[] bucket...count = 0; foreach (var item in source) { if (bucket == null) bucket = new T[
IEnumerable 接口是 C# 开发过程中非常重要的接口,对于其特性和用法的了解是十分必要的。本文将通过6个小例子,来熟悉一下其简单的用法。...阅读建议 在阅读本篇时,建议先阅读前篇《试试IEnumerable的10个小例子》,更加助于读者理解。 阅读并理解本篇需要花费5-10分钟左右的时间,而且其中包含一些实践建议。...T11分组合并 若以下代码无法正常展示,也可以点击此处查看 T12拉平三重循环 若以下代码无法正常展示,也可以点击此处查看 T13遍历树 若以下代码无法正常展示,也可以点击此处查看 T14搜索树 若以下代码无法正常展示...,也可以点击此处查看 T15分页 若以下代码无法正常展示,也可以点击此处查看 T16分页与多级缓存 若以下代码无法正常展示,也可以点击此处查看 源码说明 以上示例的源代码放置于博客示例代码库中。
- Jeffery Zhao ICollectionT>继承IEnumerableT>。在其基础上,增加了Add,Remove等方法,可以修改集合的内容。...IEnumerableT>的直接继承者还有StackT>和QueueT>。 所有标准的泛型集合都实现了ICollectionT>。...IEnumerableT>的派生类:小结 访问方式 继承自 特点 IEnumerableT> 通过ElementAt 无 所有泛型集合都继承自此接口 有非泛型版本 提供遍历(通过GetEnumerator...IEnumerableT>替代作为返回类型 IQueryableT> 通过IndexOf IEnumerableT> 从远端获得筛选之后的资料,和IEnumerableT>不同,IQueryable...IEnumerableT>是整个LINQ的基础。整个LINQ都基于IEnumerableT>的扩展方法之上。C#大部分数据结构都实现了IEnumerableT>。
核心接口 IObservable: Subscribe(IObserverT> observer) IObserver void OnNextT>(T value), 序列里有新的值的时候会调用这个...Task Task.ToObservable() 使用这个扩展方法进行包装, 当Task结束的时候, Observable推送新的数据, 然后结束 IEnumerable ienumerable.ToObservable...() 也是扩展方法, ienumerable的每个值都会作为新的值被推送到Observable上, 最后结束OnComplete Event Observable.FromEventPattern(obj...的例子: Observable.Interval(TimeSpan.FromSeconds(1)).ObserveOn(SynchronizationContext.Current).Subscribe(t...=> searchBox.Text = t.ToString()): ?
DeleteMessage(int id); IEnumerable GetAllMessages(); IEnumerable GetMessageFromUser...; IObservable SubscribeEvents(); IObservable SubscribeFromUser(string from);...LastMessage { get; private set; } public IEnumerable GetAllMessages() { lock...(_messages) return _messages.ToList(); } public IEnumerable GetMessageFromUser...LastMessage { get; private set; } public IEnumerable GetAllMessages() { lock
IEnumerable分为两个版本:泛型的和非泛型的。IEnumerable只有一个方法GetEnumerator。...如果你只需要数据而不打算修改它,不打算为集合插入或删除任何成员(例如从远端拿回数据显示),则你不需要任何比IEnumerable更复杂的接口。 ICollection继承IEnumerable。...若选定的散列表长度为质数m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均为空指针。 ?...通常我们在说ArrayList时,总是和ListT>和普通的数组(无法扩容)进行比较。ArrayList派生自IList,所以其是一个非泛型的集合。...IEnumerable的派生类:小结 访问特定位置的成员方式 继承自 特点 IEnumerable 通过ElementAt 无 有泛型版本 提供遍历(通过GetEnumerator) 不能实例化(
后记 一、一个很简单的例子 下面是一个很简单的例子:Vector为自定义表示二维向量的类型,Program的静态方法GetVetors方法获取以类型为IEnumerable..., IEnumerable, IEnumerator, IEnumerator, IDisposable。...但是有的情况下,我们需要调用别人提供的API来获取IEnumerableT>对象,我们不清楚对方有没有使用yield关键字。...在这种情况我个人常用的做法就是调用ToArray或者ToList将其转换成T[]或者ListT>,进而进行强制赋值。由于它们也实现了接口IEnumerableT>,所以不会存在什么问题。...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...T>转换为IList /// /// T">...(this IEnumerableT> data, ExpressionT, object>> Text, ExpressionT, object>> Value, string
我想要反转一个枚举,但是代码审查没过,这是为什么 在 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
在 C# 中,可以使用 IObservable 接口来实现事件流。...以下是一个简单的事件流示例:public interface IMessageService{ IObservable OnNewMessage(); TaskIEnumerable... OnNewMessage() { return _messageSubject.AsObservable(); } public TaskIEnumerable...TaskIEnumerable> GetNewMessagesAsync(); void PublishNewMessage(Message message);}public... OnNewMessage() { return _messageSubject.AsObservable(); } public TaskIEnumerable