IEnumerator与IEnumerable有什么区别?
答案 0 :(得分:104)
IEnumerable是一个定义一个方法 GetEnumerator 的接口,它返回一个 IEnumerator 接口,这反过来允许只读访问一个集合。实现IEnumerable的集合可以与foreach语句一起使用。
定义
IEnumerable
public IEnumerator GetEnumerator();
IEnumerator
public object Current;
public void Reset();
public bool MoveNext();
答案 1 :(得分:64)
IEnumerator
是可以枚举的东西:它具有Current
属性以及MoveNext
和Reset
方法(在.NET代码中你可能不会虽然你可以明确地打电话。
IEnumerable
是一个可以枚举的东西......这只是意味着它有一个返回IEnumerator
的GetEnumerator方法。
你用哪个?使用IEnumerator
的唯一原因是,如果你有一些非标准的枚举方式(即,逐个返回其各种元素),你需要定义它是如何工作的。您将创建一个实现IEnumerator
的新类。但是您仍然需要在IEnumerator
课程中返回IEnumerable
。
要查看枚举器(实现IEnumerator<T>
)的外观,请参阅任何Enumerator<T>
类,例如List<T>
,Queue<T>,
或{{ 1}}。有关实现Stack<T>
的类的信息,请参阅任何标准集合类。
答案 2 :(得分:15)
Enumerator
会显示列表或集合中的项目。
枚举器的每个实例都在某个位置(第一个元素,第七个元素等),并且可以为您提供该元素(IEnumerator.Current
)或移动到下一个元素(IEnumerator.MoveNext
)。在C#中编写foreach
循环时,编译器会生成使用枚举器的代码。
Enumerable
是一个可以为您提供Enumerator
的课程。它有一个名为GetEnumerator
的方法,它会为您提供一个查看其项目的Enumerator
。当您在C#中编写foreach
循环时,它生成的代码会调用GetEnumerator
来创建循环使用的Enumerator
。
答案 3 :(得分:9)
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();
}
}