C#迭代器

1.迭代器概念:

  迭代器又称光标,时程序设计的软件设计模式。迭代器提供一个方法顺序访问一个聚合对象的各个元素,而不暴漏内部的标识。
  在表象上看,在外部用foreach遍历对象而不需要了解其结构的,都是实现迭代器的。

2.标准迭代器的实现方法

  关键接口:IEnumerator,IEnumerable。
  命名空间:using System.Collections。
  实现方式:同时继承IEnumerator和IEnumerable,实现其中的方法。

3.使用类实现迭代器

  1.能用foreach遍历的类,必须提供IEnumerator对象,所以继承IEnumerable,实现IEnumerator GetEnumerator()方法。
  2. 继承IEnumerable接口,实现 bool MoveNext()和 Reset()方法,继承object Current对象
  3.forearch 本质
    1.会先调用in后面对象的 GetEnumerator() 获取IEnumerator对象。
    2.执行得到IEnumerator对象的MoveNext(),相当于移动光标到下一位,只要MoveNext()返回值为true,就会得到 Crrent对象,让后赋值给Item。
    3.后面就会重复MoveNext(),直到得到返回值为false,就循环结束。
    4.Reset(),会在1处初始化时,将重置光标位置。
    5.代码实现:

public class MyList : IEnumerable, IEnumerator
		{
		    private readonly int[] array;
		    private int index = -1;
		    public object Current => array[index];
		    public MyList()
		    {
		        array = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		    }
		    public IEnumerator GetEnumerator()
		    {
		        Reset();//每次foreach 都会调用一次GetEnumerator 
		        return this;
		    }
		    public bool MoveNext()//移动光标
		    {
		        if (index >= array.Length-1)
		            return false;
		        index++;
		        return true;
		    }
		    public void Reset()
		    {
		        index = -1;//重置光标位置
		    }
		}
		public class Program
		{
		    private static void Main(string[] args)
		    {
		        MyList myList = new MyList();
		        foreach (var item in myList)
		        {
		            Console.WriteLine(item);
		        }
		        Console.ReadKey();
		    }
		}

4.用yield return 语法糖实现迭代器

  语法糖:将复杂逻辑简单化,增加程序的可读性,建设程序代码出错的机会。
  实现过程:
    只需要继承IEnumerable接口 实现GetIEnumerator()方法。

		public class MyList2:IEnumerable
		{
		    private int[] array;
		    public MyList2()
		    {
		        array = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
		    }
		    public IEnumerator GetEnumerator()
		    {
		        for (int i = 0; i < array.Length; i++)
		        {
		            yield return array[i];//等待下次回来 编译代码时 会自动补全相关代码
		        }
		        /*或者下面的
		        yield return array[0];
		        yield return array[1];
		        yield return array[2];
		        yield return array[3];
		        yield return array[4];...*/
		    }
		}

5.用yield return 实现泛型迭代器

	public class MyList3<T> : IEnumerable
	{
	    private readonly T[] array;
	    public MyList3(T[] array)
	    {
	        this.array = array;
	    }
	    public IEnumerator GetEnumerator()
	    {
	        for (int i = 0; i < array.Length; i++)
	        {
	            yield return array[i];
	        }
	    }
	}
	public class Program
	{
	    private static void Main(string[] args)
	    {
	        MyList3<string> myList = new MyList3<string>(new []{"1","2"});
	        foreach (var item in myList)
	        {
	            Console.WriteLine(item);
	        }
	        Console.ReadKey();
	    }
	}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值