`
shirlly
  • 浏览: 1651730 次
  • 性别: 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#自建类实现集合接口 `IEnumerable` 和 `IEnumerator` 在C#中,自定义一个集合类并使其能够支持常见的集合操作(如迭代、添加、删除等)是非常实用的功能。下面将详细介绍如何通过实现 `IEnumerable` 和 `...

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

    IDisposable接口、IEnumerable接口和IEnumerator接口是C#中用于处理资源清理和迭代操作的关键组件。本文将深入探讨这些接口的使用及其在实际开发中的应用。 首先,IDisposable接口是C#中用于处理非托管资源释放的...

    C#中可枚举类型详解

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

    C#foreach原理

    如果该类型是一个泛型集合,还可能需要实现IEnumerable和IEnumerator接口以支持类型安全的枚举。 具体到代码实现,我们可以参考文章中给出的Person类的示例。Person类包含一个字符串数组_names,如果我们希望...

    Net面向对象程序设计枚举集合PPT教案学习.pptx

    在.NET中,枚举器有两种主要形式:非泛型的IEnumerator/IEnumerable接口和泛型的IEnumerator&lt;T&gt;/IEnumerable接口。非泛型接口允许返回object类型的元素,可能导致装箱和拆箱操作,影响性能,且缺乏类型安全性。相比...

    使用C#将DataReader转换为IEnumerable

    另一方面,`IEnumerable&lt;T&gt;`是泛型接口,它是`IEnumerable`的泛型版本,允许我们在代码中使用foreach循环来遍历数据,这在使用LINQ查询和处理数据时非常方便。 将`DataReader`转换为`IEnumerable`的原因在于,`...

    C#中IEnumerable接口用法实例分析

    总的来说,C#中的`IEnumerable`接口和其配套的`IEnumerator`接口为遍历集合提供了便利,它们是`foreach`循环的基础。通过实现这些接口,开发者可以轻松地创建自定义的数据结构并支持迭代操作。在实际编程中,理解这...

    C# 编程基础

    在C#中,`IEnumerable`和`IEnumerator`接口被用来支持集合的遍历。通过实现这些接口,可以创建可枚举的集合。 ##### 1. `IEnumerable`接口 - **定义**:`IEnumerable`接口用于声明一个集合是可枚举的。这意味着...

    IEnumerable<T>、IEnumerable、ICollection<T>、IList<T>、ObservableCollectin<T>和Collection<T>得关系。

    在.NET框架中,集合接口和类之间存在着紧密的层次关系,这些接口定义了不同类型的数据集合的行为,方便开发者根据需求选择合适的数据结构。本文将详细解释`IEnumerable&lt;T&gt;`、`IEnumerable`、`ICollection&lt;T&gt;`、`...

    yield总结与实例

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

    C#接口实验报告

    本实验展示了如何使用集合接口`IEnumerable`和`IEnumerator`来实现水果篮的功能。 - **基类`Fruit`与派生类** - 定义了一个基类`Fruit`,其中包含一个虚方法`Name`用于返回水果的名称。 - 定义了三个派生类`Apple...

    c#面试题集锦

    要使一个类支持foreach遍历,需要实现IEnumerable和IEnumerator接口。这些接口提供了遍历集合的机制。可以通过实现GetEnumerator方法和MoveNext、Reset等方法来实现遍历。 7. 程序中有什么错? 在静态函数中只能...

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

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

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

    本篇文章将深入探讨如何通过自定义类型实现四个关键的系统接口:`IComparable`、`IComparer`、`IEnumerable`和`IEnumerator`以及`IDisposable`。这些接口在各种场景下都有广泛的应用,例如数据排序、枚举遍历和资源...

    C#中的IEnumerable简介及简单实现实例

    总的来说,`IEnumerable`接口和`IEnumerator`接口是C#中实现迭代的关键,它们使得开发者能够方便地遍历任何可枚举类型的集合,包括自定义的集合类型。在给定的例子中,通过自定义迭代器,我们能够以反向顺序遍历字符...

    C# System.Collections 非泛型接口方法解析.pdf

    本文将深入解析C#中的一些关键非泛型集合接口,如`IEnumerable`、`IEnumerator`、`IComparer`、`IEqualityComparer`、`IStructuralComparable`、`IStructuralEquatable`、`ICollection`、`IList`以及`IDictionary`...

Global site tag (gtag.js) - Google Analytics