IEnumerator和IEnumerable有什么区别?

可能重复:
任何人都可以解释IEnumerable和IEnumerator给我?

IEnumerator和IEnumerable之间有什么区别?

IEnumerable是一个接口,它定义了一个方法GetEnumerator ,它返回一个IEnumerator接口,这又允许只读访问一个集合。 实现IEnumerable的集合可以与foreach语句一起使用。

定义

IEnumerable public IEnumerator GetEnumerator(); IEnumerator public object Current; public void Reset(); public bool MoveNext(); 

来自codebetter.com的示例代码

一个IEnumerator是一个可以枚举的东西:它有Current属性和MoveNextReset方法(在.NET代码中你可能不会明确地调用,尽pipe你可以)。

一个IEnumerable是可以被枚举的东西…它只是意味着它有一个GetEnumerator方法返回一个IEnumerator

你用哪个? 使用IEnumerator的唯一原因是,如果你有一些非标准的枚举方式(也就是逐个返回它的各种元素),你需要定义它是如何工作的。 你会创build一个实现IEnumerator的新类。 但是你仍然需要在IEnumerable类中返回IEnumerable

看一下枚举器(实现IEnumerator<T> )的样子,看任何Enumerator<T>类,例如List<T>Queue<T>,Stack<T>包含的那个。 有关实现IEnumerable的类,请参阅任何标准集合类。

Enumerator显示列表或集合中的项目。 枚举器的每个实例都在特定的位置(第一个元素,第七个元素等),并可以给你那个元素( IEnumerator.Current )或者移动到下一个( IEnumerator.MoveNext )。 在C#中编写foreach循环时,编译器会生成使用Enumerator的代码。

Enumerable是一个可以给你Enumerator的类。 它有一个名为GetEnumerator的方法,它给你一个Enumerator来查看它的项目。 在C#中编写foreach循环时,它生成的代码调用GetEnumerator来创build循环使用的Enumerator器。

IEnumerable和IEnumerator都是接口。 IEnumerable只有一个名为GetEnumerator的方法。 这个方法回退(因为所有方法都返回一些东西,包括void),另一个types是接口,接口是IEnumerator。 在任何集合类中实现枚举器逻辑时,都要实现IEnumerable(generics或非generics)。 IEnumerable只有一个方法,而IEnumerator有两个方法(MoveNext和Reset)和一个属性Current。 为了便于理解,请考虑IEnumebale中包含IEnumerator的框(尽pipe不通过inheritance或包含)。 查看代码以获得更好的理解:

  class Test : IEnumerable, IEnumerator { IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); } public object Current { get { throw new NotImplementedException(); } } public bool MoveNext() { throw new NotImplementedException(); } public void Reset() { throw new NotImplementedException(); } }