在C#里,迭代器、IEnumerator
接口以及 IEnumerable
接口都和集合遍历相关,不过它们的作用和使用场景存在差异。下面为你详细介绍:
1. IEnumerable
接口
- 作用:
IEnumerable
接口用于表明一个类或结构可以被迭代。实现了IEnumerable
接口的类型意味着它包含一系列元素,并且能够逐个访问这些元素。该接口只定义了一个方法GetEnumerator()
,此方法会返回一个实现了IEnumerator
接口的对象。 - 示例代码:
using System;
using System.Collections;// 自定义集合类,实现 IEnumerable 接口
class MyCollection : IEnumerable
{private int[] items = { 1, 2, 3, 4, 5 };public IEnumerator GetEnumerator(){return new MyEnumerator(items);}
}
2. IEnumerator
接口
- 作用:
IEnumerator
接口用于实际执行迭代操作。它定义了迭代器的基本行为,包含Current
属性(用于获取当前元素)、MoveNext()
方法(用于移动到下一个元素)以及Reset()
方法(用于将迭代器重置到初始位置)。 - 示例代码:
// 自定义枚举器类,实现 IEnumerator 接口
class MyEnumerator : IEnumerator
{private int[] items;private int position = -1;public MyEnumerator(int[] items){this.items = items;}public object Current{get{if (position < 0 || position >= items.Length){throw new InvalidOperationException();}return items[position];}}public bool MoveNext(){position++;return position < items.Length;}public void Reset(){position = -1;}
}
3. 迭代器
- 作用:迭代器是一种更为便捷的实现迭代的方式。借助
yield return
语句,你能够更简洁地实现IEnumerable
和IEnumerator
接口。迭代器会自动处理状态管理和元素的返回,使代码更易读写。 - 示例代码:
using System;
using System.Collections;// 使用迭代器实现 IEnumerable 接口
class MyCollectionWithIterator : IEnumerable
{private int[] items = { 1, 2, 3, 4, 5 };public IEnumerator GetEnumerator(){for (int i = 0; i < items.Length; i++){yield return items[i];}}
}
区别总结
IEnumerable
接口:主要用于表明一个类型可以被迭代,它仅定义了获取迭代器的方法。IEnumerator
接口:用于实际执行迭代操作,定义了迭代器的基本行为。- 迭代器:是一种更简便的实现迭代的方式,借助
yield return
语句自动处理状态管理和元素的返回。
使用示例
class Program
{static void Main(){// 使用自定义集合类MyCollection collection = new MyCollection();foreach (int item in collection){Console.WriteLine(item);}// 使用带有迭代器的自定义集合类MyCollectionWithIterator collectionWithIterator = new MyCollectionWithIterator();foreach (int item in collectionWithIterator){Console.WriteLine(item);}}
}
在上述示例中,MyCollection
类实现了 IEnumerable
接口并手动创建了一个 IEnumerator
实现类 MyEnumerator
。而 MyCollectionWithIterator
类则使用迭代器更简洁地实现了相同的功能。在 Main
方法里,我们对这两个集合进行了遍历。