IEnumerable是一个接口,它定义了一个方法GetEnumerator,它返回一个IEnumerator接口,这反过来允许只读访问一个集合.实现IEnumerable的集合可以与foreach语句一起使用.
定义
IEnumerable public IEnumerator GetEnumerator(); IEnumerator public object Current; public void Reset(); public bool MoveNext();
来自codebetter.com的示例代码
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代码,你可能不显式调用,尽管你可以).
一个IEnumerable
是可以枚举的东西......这只是意味着它有一个返回一个的GetEnumerator方法IEnumerator
.
你用哪个?使用的唯一原因IEnumerator
是如果你有一些非标准的枚举方式(即,逐个返回其各种元素),你需要定义它是如何工作的.你将创建一个新的类实现IEnumerator
.但你仍然需要IEnumerator
在IEnumerable
课堂上回归.
一看什么(实现一个枚举IEnumerator
)的样子,看不到任何Enumerator
类,如中所含的那些List
,Queue
或Stack
.有关实现的类IEnumerable
,请参阅任何标准集合类.
An Enumerator
显示列表或集合中的项目.枚举器的每个实例都在某个位置(第一个元素,第七个元素等),并且可以给你那个元素(IEnumerator.Current
)或移动到下一个元素(IEnumerator.MoveNext
).foreach
在C#中编写循环时,编译器会生成使用枚举器的代码.
An Enumerable
是一个可以给你Enumerator
的课程.它有一个方法调用GetEnumerator
,它可以让你Enumerator
查看它的项目.当您foreach
在C#中编写循环时,它生成的代码调用GetEnumerator
以创建Enumerator
循环使用的循环.
IEnumerable和IEnumerator都是接口.IEnumerable只有一个名为GetEnumerator的方法.此方法返回(因为所有方法返回包括void的内容)另一种类型是接口,该接口是IEnumerator.在任何集合类中实现枚举器逻辑时,实现IEnumerable(通用或非通用).IEnumerable只有一个方法,而IEnumerator有2个方法(MoveNext和Reset)和一个属性Current.为了便于理解,请考虑将IEnumebale包含在其中的IEnumerator(虽然不是通过继承或包含).请参阅代码以便更好地理解:
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(); } }