C#的IEnumerator<T> 和 IEnumerable
在 C# 中,IEnumerator 和 IEnumerable 是用于实现迭代的接口。它们的区别在于它们的功能和使用方式。
IEnumerable 接口表示一个可枚举的集合,它定义了一个方法 GetEnumerator(),该方法返回一个实现了 IEnumerator 接口的对象。这意味着类型实现了 IEnumerable 接口,它可以提供一个迭代器,用于按顺序访问集合中的元素。IEnumerable 接口是只读的,它只能支持前向迭代,不能修改集合中的元素。
IEnumerator 接口是泛型版本的迭代器接口,它继承自 IEnumerator 接口,并增加了一个 Current 属性,用于获取集合中当前位置的元素。IEnumerator 接口定义了以下方法和属性:
- bool MoveNext():将迭代器移动到集合的下一个元素,如果成功移动到下一个元素则返回 true,否则返回 false。
- void Reset():将迭代器重置到集合的起始位置。
- T Current:获取集合中当前位置的元素。
通过实现 IEnumerator 接口,可以创建一个能够迭代访问泛型集合中元素的迭代器。
下面是一个示例,演示了 IEnumerable 和 IEnumerator 的用法和区别:
using System;
using System.Collections;
using System.Collections.Generic;
public class MyCollection : IEnumerable
{
private List items = new List();
public void Add(T item)
{
items.Add(item);
}
public IEnumerator GetEnumerator()
{
return new MyEnumerator(items);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class MyEnumerator : IEnumerator
{
private List items;
private int currentIndex = -1;
public MyEnumerator(List 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 collection = new MyCollection();
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 enumerator = collection.GetEnumerator();
while (enumerator.MoveNext())
{
int item = enumerator.Current;
Console.WriteLine(item);
}
}
}
在这个示例中,我们定义了一个名为 MyCollection 的泛型集合类,它实现了 IEnumerable 接口。在 MyCollection 类中,我们使用 List 存储集合中的元素,并实现了 GetEnumerator 方法,返回一个实现了 IEnumerator 接口的迭代器。
我们还定义了一个名为 MyEnumerator 的泛型迭代器类,它实现了 IEnumerator 接口。在 MyEnumerator 类中,我们使用一个索引 currentIndex 跟踪当前位置,并实现了 MoveNext 方法、Reset 方法和 Current 属性。
在 Main 方法中,我们创建了一个 MyCollection 类型的集合实例,并向其中添加了几个元素。然后,我们使用 foreach 循环和迭代器手动遍历集合,并输出每个元素的值。
通过实现 IEnumerable 和 IEnumerator 接口,我们可以在 C# 中实现可迭代的集合,并使用foreach 循环或手动迭代器来访问集合中的元素。 IEnumerator 提供了更强大的功能,因为它允许直接访问当前元素,而不需要类型转换。
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/58f6495681.html
