当前位置:  开发笔记 > 编程语言 > 正文

IEnumerator和IEnumerable有什么区别?

如何解决《IEnumerator和IEnumerable有什么区别?》经验,为你挑选了4个好方法。

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

定义

IEnumerable 

public IEnumerator GetEnumerator();

IEnumerator

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

来自codebetter.com的示例代码



1> cgreeno..:

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

定义

IEnumerable 

public IEnumerator GetEnumerator();

IEnumerator

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

来自codebetter.com的示例代码


@Lernkurve在我发表评论后,答案被修改为正确.
@Rex M:我认为代码确实有意义.IEnumerable有一个方法GetEnumerator,它返回一个IEnumer*ator*,而不是IEnumer*able*.

2> Ryan Lundy..:

一个IEnumerator是可以列举一件事:它有Current属性和MoveNextReset方法(在.NET代码,你可能不显式调用,尽管你可以).

一个IEnumerable是可以枚举的东西......这只是意味着它有一个返回一个的GetEnumerator方法IEnumerator.

你用哪个?使用的唯一原因IEnumerator是如果你有一些非标准的枚举方式(即,逐个返回其各种元素),你需要定义它是如何工作的.你将创建一个新的类实现IEnumerator.但你仍然需要IEnumeratorIEnumerable课堂上回归.

一看什么(实现一个枚举IEnumerator)的样子,看不到任何Enumerator类,如中所含的那些List,Queue,Stack.有关实现的类IEnumerable,请参阅任何标准集合类.


@xalz,他们做两件事。IEnumerable回答了这个问题:_我可以列举我的元素吗?IEnumerator回答了这个问题:_如何枚举我的元素?如果您有十个不同的集合,它们都以相同的方式枚举,则无需定义每个枚举分别枚举的方式。因此,对于所有十个实例,您都有一个通用的IEnumerator实现类,每个集合只需使用该枚举类实现IEnumerable即可。关于关注点分离,将_holding_数据和_enumerating_数据视为单独的操作。

3> SLaks..:

An Enumerator显示列表或集合中的项目.枚举器的每个实例都在某个位置(第一个元素,第七个元素等),并且可以给你那个元素(IEnumerator.Current)或移动到下一个元素(IEnumerator.MoveNext).foreach在C#中编写循环时,编译器会生成使用枚举器的代码.

An Enumerable是一个可以给你Enumerator的课程.它有一个方法调用GetEnumerator,它可以让你Enumerator查看它的项目.当您foreach在C#中编写循环时,它生成的代码调用GetEnumerator以创建Enumerator循环使用的循环.



4> James Kingsb..:

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();
    }
}

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有