IEnumerator和IEnumerable有什么区别?
IEnumerator和IEnumerable有什么区别?
IEnumerable 是一个定义了一个方法 GetEnumerator 的接口,该方法返回一个 IEnumerator 接口,这样可以对集合进行只读访问。实现了 IEnumerable 接口的集合可以与 foreach 语句一起使用。
定义
IEnumerable
public IEnumerator GetEnumerator();
IEnumerator
public object Current;
public void Reset();
public bool MoveNext();
foreach
语句并不是绝对需要实现IEnumerable
。只需要一个匹配的IEnumerator<T> GetEnumerator()
方法即可。 - rexcfnghkIEnumerator
是一个可以枚举的对象:它具有Current
属性和MoveNext
和Reset
方法(在.NET代码中,您可能不会显式地调用它们,但您可以)。
IEnumerable
是一个可枚举的对象...这意味着它具有返回IEnumerator
的GetEnumerator
方法。
你该使用哪个?唯一使用IEnumerator
的原因是如果您有某些东西有非标准的枚举方式(即以逐个返回其各个元素的方式),并且您需要定义如何工作。您将创建实现IEnumerator
的新类。但是您仍然需要在IEnumerable
类中返回该IEnumerator
。
要查看枚举器(实现IEnumerator<T>
)的样子,请参见任何Enumerator<T>
类,例如List<T>
、Queue<T>
或Stack<T>
中包含的类。要查看实现IEnumerable
的类,请参见任何标准集合类。
IEnumerable
回答问题:我是否能枚举我的元素?IEnumerator
回答问题:我如何枚举我的元素?如果你有十个不同的集合都以相同的方式枚举,你不想要分别定义每个集合如何枚举。因此,你可以为这十个集合创建一个共同的实现IEnumerator
接口的类,然后每个集合只需要使用该枚举类实现IEnumerable
接口即可。这是关注点分离,将保持数据和枚举数据作为单独的操作来处理。 - Ryan LundyEnumerator
)用来展示列表或集合中的项目。每个枚举器实例都处于某个位置(第1个元素,第7个元素等),并能返回该元素(IEnumerator.Current
),或移动至下一个元素(IEnumerator.MoveNext
)。在 C# 中编写 foreach
循环时,编译器会生成使用枚举器的代码。Enumerable
)是一种可以提供枚举器(Enumerator
)的类。它有一个叫做 GetEnumerator
的方法,可以提供一个查看其项目的枚举器。在 C# 中编写 foreach
循环时,所生成的代码将调用 GetEnumerator
方法以创建循环所使用的枚举器。IEnumerable
和 IEnumerator
都是接口。 IEnumerable
只有一个叫做 GetEnumerator
的方法。这个方法返回(和所有方法一样返回某个东西,包括 void)另一个类型的接口,这个接口就是 IEnumerator
。当您在任何集合类中实现枚举器逻辑时,您实现 IEnumerable
(泛型或非泛型)。IEnumerable
只有一个方法,而 IEnumerator
有两个方法(MoveNext
和 Reset
)和一个属性 Current
。为了更容易理解,可以将 IEnumerable
视为包含在其内部的 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();
}
}