C# GetEnumerator():返回 IEnumerator 对象,它可用于循环访问集合中的元素

  • Post category:C#

C#中,GetEnumerator() 是IEnumerable接口提供的方法之一,它返回一个IEnumerator类型的迭代器。通过这个迭代器,我们可以按照自定义的方式遍历集合中的元素。

下面是GetEnumerator()方法的详细解释:

1.方法签名

IEnumerator<T> GetEnumerator();

2.返回值

返回一个实现IEnumerator接口的迭代器。

3.方法作用

GetEnumerator()方法返回一个实现IEnumerator接口的迭代器,通过这个迭代器,我们可以按照自定义的方式遍历集合中的元素。在调用这个方法之前,我们需要先确保我们的集合实现了IEnumerable接口。

4.方法详解

IEnumerator接口包含两个方法: MoveNext()Reset()。在GetEnumerator()方法中,我们需要创建并返回一个实现IEnumerator接口的迭代器,并将其绑定到集合中的第一个元素上。

MoveNext()方法用于将迭代器指向集合中的下一个元素。当返回 true 时,迭代器指向下一个元素;当返回 false 时,迭代器已经指向了集合的末尾。

Reset()方法用于将迭代器重置到集合的开头。

下面是一个实现IEnumerable接口的示例:

public class MyCollection<T> : IEnumerable<T>
{
    private List<T> list;
    public MyCollection(List<T> list)
    {
        this.list = list;
    }

    public IEnumerator<T> GetEnumerator()
    {
        return new MyEnumerator<T>(list);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public class MyEnumerator<T> : IEnumerator<T>
{
    private List<T> list;
    private int currentIndex = -1;

    public MyEnumerator(List<T> list)
    {
        this.list = list;
    }

    public T Current
    {
        get
        {
            try
            {
                return list[currentIndex];
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }

    object IEnumerator.Current => Current;

    public bool MoveNext()
    {
        currentIndex++;
        return (currentIndex < list.Count);
    }

    public void Reset()
    {
        currentIndex = -1;
    }

    public void Dispose()
    {
        currentIndex = -1;
    }
}

在上面的示例中,我们创建了一个自定义的集合MyCollection<T>,它实现了IEnumerable接口。在GetEnumerator()方法中,我们返回了一个实现IEnumerator的迭代器,即MyEnumerator<T>

下面是一个使用MyCollection集合的示例:

List<int> list = new List<int>() { 1, 2, 3, 4, 5 };
MyCollection<int> collection = new MyCollection<int>(list);

foreach (int item in collection)
{
    Console.WriteLine(item);
}

以上面的示例为例,输出结果如下:

1
2
3
4
5

另一个简单的示例是使用yield语句返回一个实现IEnumerator<T>接口的迭代器:

public class MyCollection<T> : IEnumerable<T>
{
    private List<T> list;
    public MyCollection(List<T> list)
    {
        this.list = list;
    }

    public IEnumerator<T> GetEnumerator()
    {
        foreach (T item in list)
        {
            yield return item;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

这个示例中没有使用自定义的迭代器类,而是使用了yield语句返回一个实现IEnumerator<T>接口的迭代器。在调用GetEnumerator()方法时,会返回一个迭代器对象,通过这个迭代器对象,我们可以遍历集合中的元素。

总的来说,通过以上的介绍,我们可以清楚的了解到GetEnumerator()方法在C#中的充要条件及作用。