IEnumerator 和 IEnumerable 之间有什么区别?
IEnumerator 和 IEnumerable 之间的区别?
Possible Duplicate:
Can anyone explain IEnumerable and IEnumerator to me?
What are the differences between IEnumerator and IEnumerable?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
IEnumerable 是一个定义一种方法的接口GetEnumerator 返回一个 IEnumerator< /a> 接口,这又允许对集合进行只读访问。 实现 IEnumerable 的集合可以与 foreach 语句一起使用。
定义
IEnumerable is an interface that defines one method GetEnumerator which returns an IEnumerator interface, this in turn allows readonly access to a collection. A collection that implements IEnumerable can be used with a foreach statement.
Definition
IEnumerator
是一个可以枚举的东西:它具有Current
属性以及MoveNext
和Reset
方法(其中在 .NET 代码中,您可能不会显式调用,尽管您可以)。IEnumerable
是一个可以枚举的东西...这仅仅意味着它有一个返回IEnumerator
的 GetEnumerator 方法。你用哪个? 使用 IEnumerator 的唯一原因是,如果您有一些具有非标准枚举方式(即一一返回其各种元素)的东西,并且您需要定义其工作方式。 您将创建一个实现
IEnumerator
的新类。 但您仍然需要在IEnumerable
类中返回该IEnumerator
。要了解枚举器(实现
IEnumerator
)的外观,请参阅任何Enumerator
类,例如List
中包含的类。 T>、
Queue、
或Stack
。 要查看实现IEnumerable
的类,请参阅任何标准集合类。An
IEnumerator
is a thing that can enumerate: it has theCurrent
property and theMoveNext
andReset
methods (which in .NET code you probably won't call explicitly, though you could).An
IEnumerable
is a thing that can be enumerated...which simply means that it has a GetEnumerator method that returns anIEnumerator
.Which do you use? The only reason to use
IEnumerator
is if you have something that has a nonstandard way of enumerating (that is, of returning its various elements one-by-one), and you need to define how that works. You'd create a new class implementingIEnumerator
. But you'd still need to return thatIEnumerator
in anIEnumerable
class.For a look at what an enumerator (implementing
IEnumerator<T>
) looks like, see anyEnumerator<T>
class, such as the ones contained inList<T>
,Queue<T>,
orStack<T>
. For a look at a class implementingIEnumerable
, see any standard collection class.Enumerator
显示列表或集合中的项目。枚举器的每个实例都位于某个位置(第一个元素、第七个元素等),并且可以为您提供该元素 (
IEnumerator.Current
) 或移动到下一个元素 (IEnumerator .MoveNext
)。 当您在 C# 中编写foreach
循环时,编译器会生成使用枚举器的代码。Enumerable
是一个可以为您提供Enumerator
的类。 它有一个名为GetEnumerator
的方法,它为您提供一个查看其项目的Enumerator
。 当您在 C# 中编写foreach
循环时,它生成的代码会调用GetEnumerator
来创建循环使用的Enumerator
。An
Enumerator
shows you the items in a list or collection.Each instance of an Enumerator is at a certain position (the 1st element, the 7th element, etc) and can give you that element (
IEnumerator.Current
) or move to the next one (IEnumerator.MoveNext
). When you write aforeach
loop in C#, the compiler generates code that uses an Enumerator.An
Enumerable
is a class that can give youEnumerator
s. It has a method calledGetEnumerator
which gives you anEnumerator
that looks at its items. When you write aforeach
loop in C#, the code that it generates callsGetEnumerator
to create theEnumerator
used by the loop.IEnumerable
和IEnumerator
都是接口。IEnumerable
只有一个名为GetEnumerator
的方法。 此方法返回(因为所有方法都返回包括 void 在内的内容)另一种类型,该类型是一个接口,该接口是 IEnumerator。 当您在任何集合类中实现枚举器逻辑时,您就实现了 IEnumerable(通用或非通用)。IEnumerable
只有一个方法,而IEnumerator
有 2 个方法(MoveNext
和Reset
)和一个属性Current
。 为了便于理解,请将IEnumerable
视为一个包含IEnumerator
的盒子(尽管不是通过继承或包含)。 请参阅代码以更好地理解:IEnumerable
andIEnumerator
are both interfaces.IEnumerable
has just one method calledGetEnumerator
. This method returns (as all methods return something including void) another type which is an interface and that interface isIEnumerator
. When you implement enumerator logic in any of your collection class, you implementIEnumerable
(either generic or non generic).IEnumerable
has just one method whereasIEnumerator
has 2 methods (MoveNext
andReset
) and a propertyCurrent
. For easy understanding considerIEnumerable
as a box that containsIEnumerator
inside it (though not through inheritance or containment). See the code for better understanding: