C#有关IEnumerable和IEnumerator学习

111 阅读2分钟

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

    在.NET中,迭代器模式被IEnumerator和IEnumerable及其对应的泛型接口所封装。如果一个类实现了IEnumerable接口,那么就能够被迭代;调用GetEnumerator方法将返回IEnumerator接口的实现,它就是迭代器本身。迭代器类似数据库中的游标,他是数据序列中的一个位置记录。迭代器只能向前移动,同一数据序列中可以有多个迭代器同时对数据进行操作。

看了大段文字没有理解,但是说像数据库中的游标,那理解起来就简单很多了,知道一次取一条数据。

下面这个例子是他人的例子

//这个博客不错https://blog.csdn.net/weixin_34117522/article/details/85934103
  //https://www.cnblogs.com/blueberryzzz/p/8667261.html
  //一个常量的数组,用于foreach遍历
  class ConstArrayList : IEnumerable
  {
      public int[] constItems = new int[] { 1, 2, 3, 4, 5 };
      public IEnumerator GetEnumerator()// 这是接口实现
      {
         Console.WriteLine("GetIEnumerator");
          return new ConstArrayListEnumeratorSimple(this);
      }
  }
  //这个常量数组的迭代器
  class ConstArrayListEnumeratorSimple : IEnumerator
  {
      ConstArrayList list;
      int index;
      int currentElement;
      public ConstArrayListEnumeratorSimple(ConstArrayList _list)
      {
          list = _list;
          index = -1;
      }

      public object Current
      {
          get
          {
              Console.WriteLine("Current");
              return currentElement;
          }
      }

      public bool MoveNext()
      {
          if (index < list.constItems.Length - 1)
          {
              Console.WriteLine("MoveNext true");
              currentElement = list.constItems[++index];//一切都在这里
              return true;
          }
          else
          {
              Console.WriteLine("MoveNext false");
              currentElement = -1;
              return false;
          }
      }

      public void Reset()
      {
          Console.WriteLine("Reset");
          index = -1;
      }
  }

运行代码

        ConstArrayList constArrayList = new ConstArrayList();
          foreach (int item in constArrayList)
          {
              Console.WriteLine(item);
          }
          Console.WriteLine("==============================");
          ConstArrayList constArrayList2 = new ConstArrayList();
          IEnumerator enumeratorSimple = constArrayList2.GetEnumerator();
          while (enumeratorSimple.MoveNext())
          {
              int item = (int)enumeratorSimple.Current;
              Console.WriteLine(item);
          }

运行结果

image.png

参考原文:www.cnblogs.com/blueberryzz… blog.csdn.net/weixin_3411…

补充学习:blog.csdn.net/byondocean/… C# 通过IEnumberable接口和IEnumerator接口实现泛型和非泛型自定义集合类型foreach功能 - 郑小超 - 博客园 (cnblogs.com)

自己理解 使用迭代器就是要返回它自己。