C# 使用迭代器实现对自定义类的foreach遍历

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jingangxin666/article/details/81275327

假设我们实现了一个自定义栈, 需要对其从栈顶到栈底遍历一遍, 找到需要的元素.

我们可以在类内部提供一个迭代器GetEnumerator , 而不必实现整个 IEnumerable接口. 当编译器检测到迭代器时, 它将自动生成 IEnumerable 或 IEnumerable<T>接口的 CurrentMoveNext 和 Dispose 方法.

即类继承接口IEnumerable, 再提供一个迭代器GetEnumerator就可以了

public IEnumerator GetEnumerator() {
    for (int i = Size-1; i >=0; i--) {
        yield return mStackArray[i];
    }
}

GetEnumerator 方法的存在使得类型成为可枚举的类型,并允许使用 foreach语句, yield 关键字向编译器指示它所在的方法是迭代器块.  在迭代器块中,yield关键字与return关键字结合使用,向枚举器对象提供值, 可以提供在foreach语句的每一次循环中返回的值.

我们还可以使用命名的迭代器来实现以不同的方式循环访问同一数据集合. 例如,可以提供一个按升序返回元素的迭代器,和一个按降序返回元素的另一个迭代器. 迭代器还可以带有参数,以便允许控制全部或部分迭代行为.

例如: 从底部到顶部遍历栈的迭代器:

// Iterate from bottom to top.        
public IEnumerable<T> BottomToTop
    {
        get
            {
                for (int i = 0; i < top; i++)
                    {
                        yield return values[i];
                    }
            }
    }

从顶部到底部部遍历栈的另外一个迭代器:

// Iterate from top to bottom.
public IEnumerable<T> TopToBottom
        {
            get
            {
                // Since we implement IEnumerable<T>
                // and the default iteration is top to bottom,
                // just return the object.
                return this;
            }
        }

外部调用的相关代码如下:

// Prints: 9 8 7 6 5 4 3 2 1 0
// Foreach legal since s.TopToBottom returns IEnumerable<int>
foreach (int n in s.TopToBottom)
{
    System.Console.Write("{0} ", n);
}
System.Console.WriteLine();

// Prints: 0 1 2 3 4 5 6 7 8 9
// Foreach legal since s.BottomToTop returns IEnumerable<int>
foreach (int n in s.BottomToTop)
{
    System.Console.Write("{0} ", n);
}

支持部分迭代行为的迭代器:

// Implementing the enumerable pattern
public System.Collections.IEnumerable SampleIterator(int start, int end)
{
    for (int i = start; i <= end; i++)
    {
        yield return i;
    }
}

命名的迭代器的调用方法如下:

ListClass test = new ListClass();

foreach (int n in test.SampleIterator(1, 10))
{
    System.Console.Write(n + " ");
}
// Output: 1 2 3 4 5 6 7 8 9 10

参考来自:

扫描二维码关注公众号,回复: 3472474 查看本文章

猜你喜欢

转载自blog.csdn.net/jingangxin666/article/details/81275327
今日推荐