`
shirlly
  • 浏览: 1623440 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

【转】IEnumerable 和 IEnumerator 接口

    博客分类:
  • .NET
阅读更多
类继承关系:public interface IQueryable<T> : IEnumerable<T>, IQueryable, IEnumerable。

              引用msdn上的介绍:

              共有两组 LINQ 标准查询运算符,一组在类型为 IEnumerable<T> 的对象上运行,另一组在类型为 IQueryable<T> 的对象上运行。构成每组运算符的方法分别是

Enumerable 和 Queryable 类的静态成员。这些方法被定义为作为方法运行目标的类型的“扩展方法”。这意味着可以使用静态方法语法或实例方法语法来调用它们。

              大家应该还记得,上节我们说过linq查询要执行在clr上师把查询语句变成扩展方法来执行,这两套东西不仅返回类型不同连所定义的扩展方法都不同,所以我们完

全可以把这2套东西理解成完全不同的东西,那么,什么时候用IEnumerable<T>,什么时候用IQueryable<T>呢?让我们再来看看msdn的介绍:

             对于在内存中集合上运行的方法(即扩展 IEnumerable<T> 的那些方法),返回的可枚举对象将捕获传递到方法的参数。在枚举该对象时,将使用查询运算符的逻辑

,并返回查询结果。

             与之相反,扩展 IQueryable <T> 的方法不会实现任何查询行为,但会生成一个表示要执行的查询的表达式树。查询处理由源 IQueryable<T> 对象处理。

             一言以蔽之,本地数据源用IEnumerable<T>,并且查询的逻辑可以直接用你所定义的方法的逻辑(因为有上下文),远程数据源用IQueryable<T>,无法直接使用你

所定义的方法的逻辑,必须先生成表达式树,查询由源对象处理。

            下面我们再来看一个例子来证明这是两套完全不同的东西:

            首先是本地数据源:

            List<string> names = new List<string> { “Cai”, “Wxied”, “Beauty” };

            然后我们看看names的where方法

            VS的智能提示会告诉我们(sorry,这个地方实在不好截图,大家可以自己尝试,我先给大家描述下)这个扩展方法有2个重载,必须传入Func<T>,返回IEnumerable<T>



            再提一点知识,Func<T>叫谓语表达式,相当于一个委托,我认为,之所以可以直接传Func<T>是因为本地数据源可以直接执行方法的逻辑。

            再让我们来看看一个远程数据源:

            DataClasses1DataContext dataContext = new DataClasses1DataContext();

            dataContext.Customers.Where这个方法有4个重载。必须传入Expression<Func<T>>,返回IQueryable<T>。

             大家和上面对比一下,就会发现本地数据源和远程数据源的扩展方法完全不一样,而且远程数据源不能直接传Func<T>,必须用一个Expression来包装这个Func<T>,正

好又从一个方面验证了我们之前所提到的知识。
分享到:
评论

相关推荐

    C# IEnumerable和IEnumerator接口浅析

    Foreach常用于循环访问集合,对实现IEnumerable的接口的容器进行遍历,IEnumerable和IEnumerator接口我有时候也有点迷糊,按官方的解释,IEnumerable是枚举器接口,IEnumerator是迭代器接口,从字面意思来看相差不大...

    C#自建类实现集合接口IEnumerable, IEnumerator

    C#自建集合类MyArrayList实现集合接口IEnumerable, IEnumerator, 实现方法 inr add(object value),void Remove(object o), int Count, void Clear()

    自定义类型实现系统接口的例子(一)

    实现IComparable和IComparer接口,IEnumerable和IEnumerator接口,IDisposable接口的例子。

    C#中可枚举类型详解

    我们经常使用的大多数集合实际上都已经实现了枚举的接口IEnumerable和IEnumerator接口,这样才能使用foreach迭代,有些是含有某种抽象了枚举细节的接口:ArrayList类型有索引,BitArray有Get方法,哈希表和字典有键...

    C# 编程基础

    (1)编写IEnglishDimensions和IMetricDimensions两个接口,同时以公制单位和英制单位显示框的尺寸。Box类继承IEnglishDimensions和...使用集合接口IEnumerable和Ienumerator实现装入水果过程及遍历水果。

    基于C#中IDisposable与IEnumerable、IEnumerator的应用

    在本文中我们将讲解使用IDisposable释放托管内存和非托管内存。  A.首先需要让类实现IDisposable接口,然后实现IDispose方法。  A.a核心Disponse(bool isDisponse)  1.此方法首先判断isReadyDisposed(判断是否第...

    yield总结与实例

    一、实现foreach的关键: 必须为包含有GetEnumerator()...四、如果返回类型为IEnumerator编译时会实现一个实现了IEnumerator接口的类 五、同理如果返回类型为IEnumerable编译时会实现一个实现了IEnumerable接口的类

    C#迭代器及Unity协程实例解析

    C#中的迭代器封装在IEnumerable和IEnumerator和他们的泛型接口中。 IEnumerable:定义了一个可以获取IEnumerator的方法—GetEnumerator()。 //IEnumerable的代码实现 public interface IEnumerable { ...

    php和C#的yield迭代器实现方法对比分析

    本文实例讲述了php和C#的yield迭代器实现方法对比。...IEnumerable表示一个类可以迭代,也就是可以用foreach遍历,IEnumerator是真正的迭代器实现,IEnumerable和IEnumerator一个是使用迭代器的接口,一个是实现迭

    C#使用yield关键字让自定义集合实现foreach遍历的方法

    一般来说当我们创建自定义集合的时候为了让其能支持foreach遍历,就只能让其实现IEnumerable接口(可能还要实现IEnumerator接口) 但是我们也可以通过使用yield关键字构建的迭代器方法来实现foreach的遍历,且自定义...

    C#从foreach语句中枚举元素看数组详解

    前言 在foreach语句中使用枚举,可以迭代数组或集合中的元素,且无须知道集合中的元素的个数。如图显示了调用foreach方法的客户端和集合之间的...有一个名为GetEnumerator()的方法它返回实现了IEnumerator接口的对象就

    C#类可以通过foreach遍历的原理

     1、类要实现公共方法 public IEnumerator GetEnumerator(){},还可以继承IEnumerable接口来实现这个方法  2、类实现了 public IEnumerator GetEnumerator(){}中,要返回一个对象用于遍历的,当然这个对象必须...

    Microsoft_Visual_Studio_International_Pack_2.0

    ◦类库:Yomigana 类库容许对串(string)类型加注 Yomigana,同时也支持对一般类型的注解功能,任何实现了IEnumerable接口的对象都可以被串类型和泛型的实例注解。为了简化复杂的注解字符串比较特设计了支持各种...

    Linq基础学习资料,通俗易懂

    5.1 IEnumerable 、IEnumerator 10 5.1.1 正常使用 10 5.1.2 C#的 yield 12 5.2 IEnumerable &lt;T&gt; 12 5.3 IEnumerator &lt;T&gt; 12 5.4 ICollection 12 5.5 ICollection &lt;T&gt; 13 5.6 IList 13 5.7 IList &lt;T&gt; 13 ...

Global site tag (gtag.js) - Google Analytics