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
属性和MoveNext
和Reset
方法(在.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(); } }