📜  C#|获取一个遍历列表的枚举器(1)

📅  最后修改于: 2023-12-03 14:40:31.003000             🧑  作者: Mango

C# | 获取一个遍历列表的枚举器

在 C# 中,可以通过 GetEnumerator() 方法获取一个枚举器(Enumerator)对象,用来遍历某个集合或列表中的元素。枚举器可以提供对当前集合的只读访问,并且允许使用 foreach 语句迭代集合中的每个元素。

获取枚举器

要获取一个遍历列表的枚举器,可以使用 GetEnumerator() 方法。此方法可用于任何实现了 IEnumerableIEnumerable<T> 接口的集合类型,例如 List<T>ArrayDictionary<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() 方法,该方法返回一个实现了 IEnumeratorIEnumerator<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 循环语句,需要实现 IEnumerableIEnumerable<T> 接口,并在内部实现一个相应的枚举器对象。