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
。它涉及到关注点的分离,将保留数据和枚举数据视为单独的操作。