C#中IEnumerator<T>和IEnumerable的区别
作者:周杰伦fans
在 C# 中,IEnumerator<T>
和 IEnumerable
是用于实现迭代的接口。它们的区别在于它们的功能和使用方式。
IEnumerable
接口表示一个可枚举的集合,它定义了一个方法 GetEnumerator()
,该方法返回一个实现了 IEnumerator
接口的对象。这意味着类型实现了 IEnumerable
接口,它可以提供一个迭代器,用于按顺序访问集合中的元素。IEnumerable
接口是只读的,它只能支持前向迭代,不能修改集合中的元素。
IEnumerator<T>
接口是泛型版本的迭代器接口,它继承自 IEnumerator
接口,并增加了一个 Current
属性,用于获取集合中当前位置的元素。IEnumerator<T>
接口定义了以下方法和属性:
bool MoveNext()
:将迭代器移动到集合的下一个元素,如果成功移动到下一个元素则返回true
,否则返回false
。void Reset()
:将迭代器重置到集合的起始位置。T Current
:获取集合中当前位置的元素。
通过实现 IEnumerator<T>
接口,可以创建一个能够迭代访问泛型集合中元素的迭代器。
下面是一个示例,演示了 IEnumerable
和 IEnumerator<T>
的用法和区别:
using System; using System.Collections; using System.Collections.Generic; public class MyCollection<T> : IEnumerable<T> { private List<T> items = new List<T>(); public void Add(T item) { items.Add(item); } public IEnumerator<T> GetEnumerator() { return new MyEnumerator<T>(items); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } public class MyEnumerator<T> : IEnumerator<T> { private List<T> items; private int currentIndex = -1; public MyEnumerator(List<T> items) { this.items = items; } public bool MoveNext() { currentIndex++; return currentIndex < items.Count; } public void Reset() { currentIndex = -1; } public T Current { get { return items[currentIndex]; } } object IEnumerator.Current { get { return Current; } } public void Dispose() { // 不需要实现 } } public class Program { public static void Main() { MyCollection<int> collection = new MyCollection<int>(); collection.Add(1); collection.Add(2); collection.Add(3); // 使用 foreach 遍历集合 Console.WriteLine("使用 foreach 遍历集合:"); foreach (int item in collection) { Console.WriteLine(item); } Console.WriteLine(); // 使用迭代器手动遍历集合 Console.WriteLine("使用迭代器手动遍历集合:"); IEnumerator<int> enumerator = collection.GetEnumerator(); while (enumerator.MoveNext()) { int item = enumerator.Current; Console.WriteLine(item); } } }
在这个示例中,我们定义了一个名为 MyCollection<T>
的泛型集合类,它实现了 IEnumerable<T>
接口。在 MyCollection<T>
类中,我们使用 List<T>
存储集合中的元素,并实现了 GetEnumerator
方法,返回一个实现了 IEnumerator<T>
接口的迭代器。
我们还定义了一个名为 MyEnumerator<T>
的泛型迭代器类,它实现了 IEnumerator<T>
接口。在 MyEnumerator<T>
类中,我们使用一个索引 currentIndex
跟踪当前位置,并实现了 MoveNext
方法、Reset
方法和 Current
属性。
在 Main
方法中,我们创建了一个 MyCollection<int>
类型的集合实例,并向其中添加了几个元素。然后,我们使用 foreach
循环和迭代器手动遍历集合,并输出每个元素的值。
通过实现 IEnumerable<T>
和 IEnumerator<T>
接口,我们可以在 C# 中实现可迭代的集合,并使用foreach
循环或手动迭代器来访问集合中的元素。 IEnumerator<T>
提供了更强大的功能,因为它允许直接访问当前元素,而不需要类型转换。
到此这篇关于C#中IEnumerator<T>和IEnumerable的区别的文章就介绍到这了,更多相关C# IEnumerator<T> IEnumerable内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!