C# IEnumerator和IEnumerable之间有什么区别?
可能重复:C# IEnumerator和IEnumerable之间有什么区别?,c#,.net,ienumerable,ienumerator,C#,.net,Ienumerable,Ienumerator,可能重复: IEnumerator和IEnumerable之间有什么区别?IEnumerable和IEnumerator都是接口IEnumerable只有一个名为GetEnumerator的方法。此方法返回另一种类型(因为所有方法都返回一些东西,包括void),这是一个接口,该接口是IEnumerator。在任何集合类中实现枚举器逻辑时,都实现了IEnumerable(泛型或非泛型)IEnumerable只有一个方法,而IEnumerator有两个方法(MoveNext和Reset)和一个属性
IEnumerator和IEnumerable之间有什么区别?
IEnumerable
和IEnumerator
都是接口IEnumerable
只有一个名为GetEnumerator
的方法。此方法返回另一种类型(因为所有方法都返回一些东西,包括void),这是一个接口,该接口是IEnumerator
。在任何集合类中实现枚举器逻辑时,都实现了IEnumerable
(泛型或非泛型)IEnumerable
只有一个方法,而IEnumerator
有两个方法(MoveNext
和Reset
)和一个属性Current
。为了便于理解,请考虑<代码> iQueDebug <代码>,作为一个包含“代码> 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();
}
}
是一个接口,它定义一个方法GetEnumerator,该方法返回一个接口,从而允许对集合进行只读访问。实现IEnumerable的集合可以与foreach语句一起使用
定义
IEnumerable
public IEnumerator GetEnumerator();
IEnumerator
public object Current;
public void Reset();
public bool MoveNext();
一个
IEnumerator
是一个可以枚举的东西:它有Current
属性和MoveNext
和Reset
方法(在.NET代码中,您可能不会显式调用这些方法,尽管可以)
IEnumerable
是一种可以枚举的东西……这意味着它有一个GetEnumerator方法,返回一个IEnumerator
你用哪一种?使用IEnumerator
的唯一原因是,如果您有非标准的枚举方式(即逐个返回各种元素),您需要定义其工作方式。您将创建一个实现IEnumerator
的新类。但是您仍然需要在IEnumerable
类中返回IEnumerator
要查看枚举器(实现
IEnumerator
)的外观,请参阅任何枚举器
类,例如列表
、队列、
或堆栈
中包含的类。要查看实现IEnumerable
的类,请参阅任何标准集合类。一个枚举器显示列表或集合中的项。
枚举数的每个实例都位于某个位置(第一个元素、第七个元素等),可以为您提供该元素(IEnumerator.Current
)或移动到下一个(IEnumerator.MoveNext
)。在C#中编写foreach
循环时,编译器生成使用枚举器的代码
Enumerable
是一个可以为您提供Enumerator
s的类。它有一个名为GetEnumerator
的方法,该方法为您提供一个查看其项的Enumerator
。在C#中编写foreach
循环时,它生成的代码调用GetEnumerator
来创建循环使用的Enumerator
。重复:本文可能会帮助您@雷克斯M:我认为代码是有意义的。IEnumerable有一个方法GetEnumerator,它返回的是IEnumerator,而不是IEnumerable。@Lernkurve在我发表评论后,答案被修改为正确的。本文可能会对您有所帮助。我想补充一点,实现IEnumerable
并不是绝对要求将类与foreach
语句一起使用。只需要一个匹配的IEnumerator GetEnumerator()
方法。foreach循环的实际需求限制更少,并且根本不绑定到这些接口。编译器执行模式匹配。GetEnumerator方法只需要返回一个类/结构,该类/结构又有一个当前属性和一个返回bool的MoveNext方法。我可以强烈建议,博客文章是相当不准确的。那么为什么我们需要这个IEnumerable抽象,如果它只提供一个访问枚举器的权限呢?为什么不直接使用枚举器呢instead@xalz,他们做两件不同的事IEnumerable
回答了这个问题:我可以枚举我的元素吗IEnumerator
回答了以下问题:如何枚举元素?如果您有十个不同的集合,它们都以相同的方式枚举,那么您不需要定义每个集合如何分别枚举。因此,您有一个通用的IEnumerator
——为所有十个集合实现类,每个集合只需使用该枚举类实现IEnumerable
。它涉及到关注点的分离,将保留数据和枚举数据视为单独的操作。