首页 >后端开发 >C++ >C# 中的 IEnumerable 和 IEnumerator:它们如何启用 foreach 循环和自定义迭代器?

C# 中的 IEnumerable 和 IEnumerator:它们如何启用 foreach 循环和自定义迭代器?

Patricia Arquette
Patricia Arquette原创
2025-01-09 12:51:41665浏览

IEnumerable and IEnumerator in C#: How Do They Enable foreach Loops and Custom Iterators?

深入理解 IEnumerable 和 IEnumerator:.NET 迭代器的核心机制

在 .NET 编程中,实现 IEnumerable 接口是启用 foreach 循环的关键。虽然 foreach 语法简洁易用,但其底层依赖于 IEnumerable 和 IEnumerator 接口。

IEnumerable 和 IEnumerator 的应用场景

IEnumerable 不是用来“替代” foreach 的;相反,实现 IEnumerable 是使用 foreach 的前提条件。当您编写 foreach 循环时,编译器实际上会将其转换为一系列对 IEnumerator 的 MoveNext 和 Current 方法的调用。

IEnumerable 和 IEnumerator 的区别

  • IEnumerable: 定义了 GetEnumerator 方法的接口,该方法返回一个 IEnumerator。
  • IEnumerator: 定义了 MoveNext 和 Current 两个方法的接口。MoveNext 将迭代器移动到序列中的下一项,而 Current 返回当前项。

为什么我们需要 IEnumerable 和 IEnumerator?

  • 自定义迭代器: 通过在自定义类上实现 IEnumerable,您可以使用 foreach 循环遍历这些类。
  • 理解迭代器机制: IEnumerator 提供了一种低级别的机制来遍历集合,允许您控制遍历过程。
  • 泛型集合: C# 编译器使用 IEnumerable 和 IEnumerator 来创建泛型集合类,例如 List 和 Dictionary
  • 异步编程: IEnumerator 可以与异步编程模型结合使用,以遍历异步序列。

实现 IEnumerable

要使类可迭代,您需要实现 IEnumerable 接口,这需要实现返回 IEnumerator 的 GetEnumerator 方法。

示例

考虑以下实现 IEnumerable 接口的自定义对象类:

<code class="language-csharp">public class CustomCollection : IEnumerable<int>
{
    private int[] data;

    public IEnumerator<int> GetEnumerator()
    {
        return new CustomEnumerator(data);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }

    private class CustomEnumerator : IEnumerator<int>
    {
        // MoveNext 和 Current 方法用于遍历 data
    }
}</code>

通过实现 IEnumerable 并提供自定义枚举器,您现在可以使用 foreach 循环遍历 CustomCollection 的实例。

以上是C# 中的 IEnumerable 和 IEnumerator:它们如何启用 foreach 循环和自定义迭代器?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn