• C#中IEumerable的简单了解


    参考网址:https://blog.csdn.net/qq_39806817/article/details/115024666

    一、IEnumerable简单介绍
    IEnumerable是可枚举类型,一般在迭代时应用广泛,如foreach中要循环访问的集合或数组都实现了IEnumerable接口。只要能够遍历,都直接或间接实现了IEnumerable接口。如:String类型的对象,可遍历,输出时以字符输出,间接实现了IEnumerable接口,"OOP"遍历打印就是'O','O','P';又如int类型没有实现IEnumerable接口,就无法依赖foreach遍历。
    二、实现IEnumerable接口
    现以一个实例遍历数组:
    IEnumerableTest enumerableTest = new IEnumerableTest();
    enumerableTest.Show();

    -------------------------------------------------------
    public class IEnumerableTest
    {
      DemoIEnumerable demoIEnumerable = new DemoIEnumerable();
      public void Show()
      {
        foreach (var item in demoIEnumerable)
        {
          Console.WriteLine(item);
        }
      }
    }

    public class DemoIEnumerable : IEnumerable
    {
      public IEnumerator GetEnumerator()
      {
        string[] students = new[] { "瑶瑶1", "瑶瑶2", "瑶瑶3" };
        return new TestEnumerator(students);
      }
    }

    public class TestEnumerator : IEnumerator
    {
      private string[] _students;
      //元素下标
      private int _position = -1;

      public TestEnumerator(string[] students)
      {
        this._students = students;
      }

        //public object Current => throw new NotImplementedException();
      public object Current
      {
        get
        {
          if (_position == -1 || _position >= _students.Length)
          {
            throw new InvalidOperationException();
          }
          return _students[_position];
        }
      }

      public bool MoveNext()
      {
        if (_position < _students.Length - 1)
        {
          _position++;
          return true;
        }
        return false;
      }

      public void Reset()
      {
        _position = -1;
      }
    }
    上面的实例执行foreach步骤:首先进入DemoIEnumerable类执行GetEnumerator()方法,然后初始化_position=-1,接着执行TestEnumerator类的构造函数,然后返回进入in,执行TestEnumerator类的MoveNext()方法,判断下标(_position)是否越界,如没有越界,下标自动加1,并返回true,然后获取TestEnumerator类的Current属性,返回对应下标的值,依次迭代,获取数组的值,直至结束。

  • 相关阅读:
    .NET面试题系列(五)数据结构(Array、List、Queue、Stack)及线程安全问题
    一个使用 Go 的思维来帮助您构建并开发 Go 应用程序的开源框架
    UML类图学习
    服务器防攻击手段
    .NET面试题系列(四)计算机硬件知识
    .NET面试题系列(三)排序算法
    ASP.NET MVC学习(五)之MVC原理解析
    socketWriter.go
    multiWriter.go
    timeCache.go
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15113035.html
Copyright © 2020-2023  润新知