IEnumerator 和 IEnumerable 之间有什么区别?

发布于 2024-07-14 19:56:49 字数 260 浏览 8 评论 0原文

可能的重复:
谁能给我解释一下 IEnumerable 和 IEnumerator 吗?

IEnumerator 和 IEnumerable 之间的区别?

Possible Duplicate:
Can anyone explain IEnumerable and IEnumerator to me?

What are the differences between IEnumerator and IEnumerable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

毁梦 2024-07-21 19:56:49

IEnumerable 是一个定义一种方法的接口GetEnumerator 返回一个 IEnumerator< /a> 接口,这又允许对集合进行只读访问。 实现 IEnumerable 的集合可以与 foreach 语句一起使用。

定义

IEnumerable 

public IEnumerator GetEnumerator();

IEnumerator

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

IEnumerable is an interface that defines one method GetEnumerator which returns an IEnumerator interface, this in turn allows readonly access to a collection. A collection that implements IEnumerable can be used with a foreach statement.

Definition

IEnumerable 

public IEnumerator GetEnumerator();

IEnumerator

public object Current;
public void Reset();
public bool MoveNext();
望笑 2024-07-21 19:56:49

IEnumerator 是一个可以枚举的东西:它具有 Current 属性以及 MoveNextReset 方法(其中在 .NET 代码中,您可能不会显式调用,尽管您可以)。

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

你用哪个? 使用 IEnumerator 的唯一原因是,如果您有一些具有非标准枚举方式(即一一返回其各种元素)的东西,并且您需要定义其工作方式。 您将创建一个实现 IEnumerator 的新类。 但您仍然需要在 IEnumerable 类中返回该 IEnumerator

要了解枚举器(实现 IEnumerator)的外观,请参阅任何 Enumerator 类,例如 List中包含的类。 T>、QueueStack。 要查看实现 IEnumerable 的类,请参阅任何标准集合类。

An IEnumerator is a thing that can enumerate: it has the Current property and the MoveNext and Reset methods (which in .NET code you probably won't call explicitly, though you could).

An IEnumerable is a thing that can be enumerated...which simply means that it has a GetEnumerator method that returns an IEnumerator.

Which do you use? The only reason to use IEnumerator is if you have something that has a nonstandard way of enumerating (that is, of returning its various elements one-by-one), and you need to define how that works. You'd create a new class implementing IEnumerator. But you'd still need to return that IEnumerator in an IEnumerable class.

For a look at what an enumerator (implementing IEnumerator<T>) looks like, see any Enumerator<T> class, such as the ones contained in List<T>, Queue<T>, or Stack<T>. For a look at a class implementing IEnumerable, see any standard collection class.

一人独醉 2024-07-21 19:56:49

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

Enumerable 是一个可以为您提供Enumerator 的类。 它有一个名为 GetEnumerator 的方法,它为您提供一个查看其项目的 Enumerator 。 当您在 C# 中编写 foreach 循环时,它生成的代码会调用 GetEnumerator 来创建循环使用的 Enumerator

An Enumerator shows you the items in a list or collection.
Each instance of an Enumerator is at a certain position (the 1st element, the 7th element, etc) and can give you that element (IEnumerator.Current) or move to the next one (IEnumerator.MoveNext). When you write a foreach loop in C#, the compiler generates code that uses an Enumerator.

An Enumerable is a class that can give you Enumerators. It has a method called GetEnumerator which gives you an Enumerator that looks at its items. When you write a foreach loop in C#, the code that it generates calls GetEnumerator to create the Enumerator used by the loop.

未央 2024-07-21 19:56:49

IEnumerableIEnumerator 都是接口。 IEnumerable 只有一个名为 GetEnumerator 的方法。 此方法返回(因为所有方法都返回包括 void 在内的内容)另一种类型,该类型是一个接口,该接口是 IEnumerator。 当您在任何集合类中实现枚举器逻辑时,您就实现了 IEnumerable(通用或非通用)。 IEnumerable 只有一个方法,而 IEnumerator 有 2 个方法(MoveNextReset)和一个属性 Current。 为了便于理解,请将 IEnumerable 视为一个包含 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();
    }
}

IEnumerable and IEnumerator are both interfaces. IEnumerable has just one method called GetEnumerator. This method returns (as all methods return something including void) another type which is an interface and that interface is IEnumerator. When you implement enumerator logic in any of your collection class, you implement IEnumerable (either generic or non generic). IEnumerable has just one method whereas IEnumerator has 2 methods (MoveNext and Reset) and a property Current. For easy understanding consider IEnumerable as a box that contains IEnumerator inside it (though not through inheritance or containment). See the code for better understanding:

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();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文