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