C# IEnumerable 和 IEnumerator 有什么区别?怎么用?

文章导读
Previous Quiz Next 在 C# 中,IEnumerable 和 IEnumerator 是用于遍历集合的基本接口。它们提供了一种标准方式来遍历每个元素,而无需暴露集合内部的构建或存储方式。
📋 目录
  1. A C# 中的 IEnumerable
  2. B C# 中的 IEnumerator
  3. C 结论
A A

C# 中的 IEnumerable 与 IEnumerator



Previous
Quiz
Next

在 C# 中,IEnumerableIEnumerator 是用于遍历集合的基本接口。它们提供了一种标准方式来遍历每个元素,而无需暴露集合内部的构建或存储方式。

C# 中的 IEnumerable

在 C# 中,IEnumerable 是一个表示可以迭代的对象的集合的接口。

  • 它允许你遍历集合,而无需暴露集合内部的构建或存储方式。
  • IEnumerable 有两种形式:非泛型(System.Collections 命名空间)和 泛型(System.Collections.Generic 命名空间)。
在 C# 中,命名空间是用于包含和组织 class、interface 和其他类型的文件夹。

C# 中的非泛型 IEnumerable

非泛型 IEnumerable 属于 "System.Collections" 命名空间,表示任意类型的对象集合,因此无需指定元素类型。

让我们通过一个 C# 示例 来理解 非泛型 IEnumerable

using System;
using System.Collections;

class Program {
   static void Main() {
   
      // 可以存储任意类型的对象
      IEnumerable collection = new ArrayList();
      collection = new ArrayList { 1, "Hello", 3.5 };

      foreach (var item in collection) {
         Console.WriteLine(item);
      }
   }
}

运行此代码时,将产生以下输出

1
Hello
3.5

C# 中的泛型 IEnumerable

泛型 IEnumerable 属于 "System.Collections.Generic" 命名空间,表示特定类型(强类型)的对象集合,因此需要指定元素类型。

使用 <T>(如 <int> 或 <string>)来指定类型,这可以防止类型错误并提高性能。

以下 示例 演示了如何在 C# 中使用 泛型 IEnumerable

using System;
using System.Collections.Generic;
class Program {
   static void Main() {
      IEnumerable<int> numbers = new List<int> { 1, 2, 3, 4 };

      foreach (int number in numbers) {
         Console.WriteLine(number);
      }
   }
}

以下是输出

1
2
3
4

在这里,集合只能存储整数,这更安全且更快。

C# 中的 IEnumerator

In C#, IEnumerator 是一个接口,它实际执行对集合的迭代,并负责在迭代过程中管理集合中的当前位置。

  • 它提供了遍历集合和访问当前元素的方法。
  • IEnumerator 也存在两种形式:non-generic(System.Collections 命名空间)和 generic(System.Collections.Generic 命名空间)。

以下是 IEnumerator 的三个成员 −

  • Current 属性 − 返回枚举器当前位置的元素。
  • MoveNext() 方法 − 将枚举器移动到下一个元素,如果成功移动则返回 true;否则返回 false。
  • Reset() 方法 − 将枚举器重置为其初始位置。

C# 中的非泛型 IEnumerator

非泛型 IEnumerator 遍历 IEnumerable 集合,该集合可以包含任何类型的对象。以下 示例展示了其工作原理 −

using System;
using System.Collections;
using System.Collections.Generic;

class Program {
   static void Main() {
      // 使用 ArrayList,因为它可以存储任何类型的对象
      IEnumerable collection = new ArrayList { 1, "Hello", 3.5, 'T', "Aman" };

      IEnumerator enumerator = collection.GetEnumerator();

      // MoveNext() 移动到下一个元素
      while (enumerator.MoveNext()) {
         Console.WriteLine(enumerator.Current);
      }

      // 可选:重新开始
      enumerator.Reset();
   }
}

以下是 输出

1
Hello
3.5
T
Aman

C# 中的泛型 IEnumerator

泛型 IEnumerator 遍历 IEnumerable 集合,该集合仅包含特定类型的对象。请查看以下 示例 以了解其工作原理 −

using System;
using System.Collections.Generic;

class Program {
   static void Main() {
      List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
      
      IEnumerator<int> enumerator = numbers.GetEnumerator();
      // Enumerator 的 MoveNext 方法
      while (enumerator.MoveNext()) {
         Console.WriteLine(enumerator.Current);
      }
      // 可选,重新开始
      enumerator.Reset();
   }
}

运行此代码将产生以下 输出

1
2
3
4
5

说明:IEnumerator 提供了对迭代的手动控制。因此,我们必须显式调用 "MoveNext()" 和 "Current" 来移动到下一个元素。

结论

IEnumerableIEnumerator 用于在 C# 中遍历集合。IEnumerable 提供了一种使用 foreach 循环逐个从集合中获取项的方法。IEnumerator 用于在循环过程中遍历集合并获取每个项。