C#——迭代器

简介: C#——迭代器

迭代器(iterator)有时又称光标(cursor),它是程序设计的软件设计模式。

迭代器模式提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的标识。在表现效果上看是可以在容器对象(例如链表或数组)上遍历访问的接口,设计人员无需关心容器对象的内存分配的实现细节。可以用foreach遍历的类,都是实现了迭代器。

简单来说,迭代器模式使得你能够获取到序列中的所有元素而不用关心是其类型是array,list,linked list或者是其他什么序列结构。这一点使得能够非常高效的构建数据处理通道(data pipeline)--即数据能够进入处理通道,进行一系列的变换,或者过滤,然后得到结果。事实上,这正是LINQ的核心模式。

举个例子,使用迭代器写个和foreach类似的功能来遍历一个字符串,输出它每个字符:

        static void Main()
        {
            string str = "ABCDEFG";
            foreachFunc(str);
            foreach (char a in str)
            {
                Console.WriteLine("官方foreach里的循环是:" + a);
            }
        }
        static void foreachFunc(string str)
        {
            IEnumerator e = str.GetEnumerator();
            while (e.MoveNext())
            {
                Console.WriteLine("民间foreach里的循环是:" + e.Current);
            }
        }

效果是:

869d61aaf8674bdaaa9a1401376a481a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.webp.jpg

foreach的本质是先获取in后面这个对象的IEnumerator(会调用对象其中的GetEnumerator方法来获取),然后执行得到这个IEnumerator对象中的MoveNext方法。其实只要MoveNext方法的返回值时true就会去得到current,然后复制给item。

举个例子:

    forreach (int item in list)
    {
        Console.writeLine(item);
    }

yield return是c#提供给我们的语法糖。

所谓语法糖,也称糖衣语法。其主要作用就是将复杂逻辑简单化,可以增加程序的可读性,从而减少程序代码出错的机会。

关键接口:IEnumerable

命名空间:using System.collections;

让想要通过foreach遍历的自定义类实现接口中的方法GetEnumerator即可

举个例子:

class CustomList2 : IEnumerable
{
    private int[] list;
    public CustomList2()
    {
        list = new int[] { 1,2,3,4,5,6,7,8};
    }
    public IEnumerator GetEnumerator()
    {
        throw new NotImplementedException();
    }
}


目录
相关文章
|
5月前
|
开发框架 .NET C#
C#语言进阶(四) 枚举器和迭代器
C#语言进阶(四) 枚举器和迭代器
36 0
|
C# 图形学
【unity之c#】所以迭代器的原理知识你还清楚吗?
【unity之c#】所以迭代器的原理知识你还清楚吗?
144 0
C#编程-94:迭代器Iterator简单实例
C#编程-94:迭代器Iterator简单实例
117 0
C#编程-94:迭代器Iterator简单实例
C#编程-93:迭代器Iterator概述
C#编程-93:迭代器Iterator概述
C#编程-93:迭代器Iterator概述
C#编程-93:迭代器Iterator概述
C#编程-93:迭代器Iterator概述C
119 0
C#编程-93:迭代器Iterator概述
|
Java C# 设计模式
使用C# (.NET Core) 实现迭代器设计模式 (Iterator Pattern)
本文的概念来自深入浅出设计模式一书 项目需求 有两个饭店合并了, 它们各自有自己的菜单. 饭店合并之后要保留这两份菜单. 这两个菜单是这样的: 菜单项MenuItem的代码是这样的: 最初我们是这样设计的, 这是第一份菜单: 这是第2份菜单: 同时有两个菜单存在的问题 问题就是多个菜单把事情变复杂了.
1034 0
|
C#
编写高质量代码改善C#程序的157个建议[勿选List<T>做基类、迭代器是只读的、慎用集合可写属性]
原文:编写高质量代码改善C#程序的157个建议[勿选List做基类、迭代器是只读的、慎用集合可写属性] 前言   本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html 。
999 0
|
C#
编写高质量代码改善C#程序的157个建议[勿选List<T>做基类、迭代器是只读的、慎用集合可写属性]
前言   本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html 。本文主要学习记录以下内容:   建议23、避免将List作为自定义集合类的基类    建议24、迭代器应该是只读的   建议25、谨慎集合属性的可写操作 建议23、避免将List作为自定义集合类的基类  如果要实现一个自定义的集合类,最好不要以List作为基类,而应该扩展相应的泛型接口,通常是Ienumerable和ICollection(或ICollection的子接口,如IList。
908 0