zoukankan      html  css  js  c++  java
  • 迭代器

    1、Foreach只能遍历一个可枚举的集合(就是实现了IEnumerable接口

    2、System.Array类、String类等实现了IEnumerable接口。

    3、在IEnumerable接口中,包含了一个名为GetEnumerator的方法: IEnumerator  GetEnumerator( );

         GetEnumerator方法返回一个枚举器对象(枚举器对象用于遍历(可枚举)集合中的元素),这个枚举数类实现了IEnumerator接口。

        IEnumerator接口规定了以下属性和方法:

        Ⅰ、Object Current {get;}

      Ⅱ、Bool MoveNext();

      Ⅲ、 Void Reset();

    4、 使用一个集合的GetEnumerator方法来创建一个枚举数,然后反复调用MoveNext方法,并获取Current属性的值,就可以每次在该集合中移动一个元素的位置。这正是foreach语句所做的事情。

    5、一个迭代器块(iterator block)是一个能够产生有序的值序列的块。迭代器块和普通语句块的区别就是其中出现的一个或多个yield语句。

    6、在迭代器块中,使用yield关键字选择要在foreach循环中使用的值。其语法如下:

        yield return value;

       对于迭代器,可以使用下面的语句中断信息返回foreach循环的过程:

        yield break;

       在遇到迭代器中的这个语句时,迭代器的处理会立即中断,就像foreach循环使用它一样。 

    7、编译器生成的枚举数中Reset方法没有实现。而它是接口需要的方法,因此调用实现时总是抛出System.NotSupportedException异常。

     public class DaysOfTheWeek : System.Collections.IEnumerable
        {
            string[] m_Days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
            public System.Collections.IEnumerator GetEnumerator()
            {
                for (int i = 0; i < m_Days.Length; i++)
                {
                    yield return m_Days[i];
                }
            }
        }
        class TestDaysOfTheWeek
        {
            static void Main()
            {
                // Create an instance of the collection class
                DaysOfTheWeek week = new DaysOfTheWeek(); // Iterate with foreach 
                foreach (string day in week)
                {
                    System.Console.Write(day + " ");
                }

    IEnumerator ee= week.GetEnumerator();
    while (ee.MoveNext())
    {
        Console.WriteLine(ee.Current);
    }

       }

        }

     命名迭代器

    class Program
        {
            static void Main(string[] args)
            {
                Class1 c = new Class1();
    
                foreach (int i in c.MaxToMin(1, 2))
                {
                    Console.WriteLine(i);
                }
    
                foreach (object i in c.MinToMax)
                {
                    Console.WriteLine(i.ToString());
                }
            }
        }
    
        class Class1
        {
            // 定义一个命名的迭代器,并可以提供参数
            public IEnumerable MaxToMin(int min, int max)
            {
                for (int i = max; i >= min; i--)
                {
                    yield return i; // 返回元素
                }
                yield return "ktgu";
            }
    
            // 定义一个迭代器类型的属性,
            public IEnumerable MinToMax
            {
                //this表示该类实例,因为该类实现了GetEnumerator(),它是可枚举的
                get { yield return this; }
            }
        }

     

     

     

  • 相关阅读:
    .NET HttpWebRequest应用
    .NET 文件上传和文件接收
    小程序报错:对应的服务器 TLS 为 TLS 1.0 ,小程序要求的 TLS 版本必须大于等于 1.2
    发布微信小程序体验版
    .NET 通过entity framework报数据库连接错误:ORA-01017: invalid username/password; logon denied
    将Oracle 12c的某用户数据迁移至OracleXE的用户
    C# Oracle 时间字符串转时间类型
    在.NET中调用Java的类
    Oracle 取前几条记录
    oracle impdp将导出用户的所有对象导入至另一个用户下,生成的触发器语句问题处理
  • 原文地址:https://www.cnblogs.com/XiaoqiangNiu/p/3666636.html
Copyright © 2011-2022 走看看