📅  最后修改于: 2023-12-03 14:40:31.003000             🧑  作者: Mango
在 C# 中,可以通过 GetEnumerator()
方法获取一个枚举器(Enumerator)对象,用来遍历某个集合或列表中的元素。枚举器可以提供对当前集合的只读访问,并且允许使用 foreach
语句迭代集合中的每个元素。
要获取一个遍历列表的枚举器,可以使用 GetEnumerator()
方法。此方法可用于任何实现了 IEnumerable
或 IEnumerable<T>
接口的集合类型,例如 List<T>
、Array
、Dictionary<TKey, TValue>
、Stack<T>
等等。
以下示例演示了如何从一个简单的整型列表中获取枚举器:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
IEnumerator<int> enumerator = numbers.GetEnumerator();
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
在此示例中,我们首先定义了一个整型列表 numbers
,然后使用 GetEnumerator()
方法获取了一个整数型枚举器。
接下来,我们使用 MoveNext()
方法来移动指针并检查是否还有剩余项。如果 MoveNext()
返回 true
,则说明列表中还有剩余项,我们便可以使用 Current
属性获取当前项的值。
当 MoveNext()
执行到列表末尾时,将返回 false
并退出循环。注意,枚举器不会把指针调整回列表开始处,也就是说,如果需要再次遍历列表,需要重新获取一个新的枚举器。
foreach
语句枚举器是 foreach
语句的基础,因此它们需要支持这个语句。为了支持 foreach
,需要在集合类中实现一个 GetEnumerator()
方法,该方法返回一个实现了 IEnumerator
或 IEnumerator<T>
接口的类的实例。这个接口包含了许多有用的方法和属性,例如 MoveNext()
、Reset()
、Current
等等,可以方便地操作集合中的元素。
以下是一个支持 foreach
语句的自定义集合的示例:
class MyCollection : IEnumerable<int>
{
private List<int> _list;
public MyCollection()
{
_list = new List<int>();
}
public void Add(int value)
{
_list.Add(value);
}
public IEnumerator<int> GetEnumerator()
{
return _list.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
在此示例中,我们实现了 IEnumerable<int>
接口,并在内部使用了一个 List<int>
对象,以便支持 Add()
方法的使用。接着,我们实现了一个 GetEnumerator()
方法,以便返回一个整数型枚举器。
最后,我们还实现了一个 IEnumerable.GetEnumerator()
方法,以便使我们的集合可以支持隐式的 foreach
循环。
有了这些代码,我们便可以在任何支持 IEnumerable
接口的上下文中使用 MyCollection
对象,例如:
MyCollection collection = new MyCollection();
collection.Add(1);
collection.Add(2);
collection.Add(3);
foreach (int value in collection)
{
Console.WriteLine(value);
}
输出结果将是:
1
2
3
枚举器是 C# 中非常重要的对象之一,可以用来遍历集合或列表中的元素,并支持 foreach
循环语句。要获取一个枚举器,可以调用集合对象的 GetEnumerator()
方法,然后使用 MoveNext()
和 Current
属性访问其中的元素。
如果需要自定义一个集合类型,并希望支持 foreach
循环语句,需要实现 IEnumerable
或 IEnumerable<T>
接口,并在内部实现一个相应的枚举器对象。