IEnumerator和IEnumerable有什么区别?

时间:2009-03-06 16:50:46

标签: c# .net ienumerable ienumerator

  

可能重复:
  Can anyone explain IEnumerable and IEnumerator to me?

IEnumerator与IEnumerable有什么区别?

4 个答案:

答案 0 :(得分:104)

IEnumerable是一个定义一个方法 GetEnumerator 的接口,它返回一个 IEnumerator 接口,这反过来允许只读访问一个集合。实现IEnumerable的集合可以与foreach语句一起使用。

定义

IEnumerable 

public IEnumerator GetEnumerator();

IEnumerator

public object Current;
public void Reset();
public bool MoveNext();

example code from codebetter.com

答案 1 :(得分:64)

IEnumerator是可以枚举的东西:它具有Current属性以及MoveNextReset方法(在.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();
        }
    }