[c#] IEnumerable可枚举类型接口分析yield

foreach遍历条件

.net中迭代器是通过IEnumerable和IEnumerator接口来实现的。
在这里插入图片描述
因此string可以使用foreach进行遍历

            string str = "yoyoqikinao";
            foreach (var item in str)
            {
    
    
                Console.WriteLine(item);
            }

首先我们来看看IEnumerable接口:
在这里插入图片描述
里面只有一个返回 IEnumerator 的方法 GetEnumerator();

IEnumerator里面有一个属性,两个方法:
在这里插入图片描述
在这里插入图片描述

使用 yield return 上下文关键字定义迭代器方法

在这里插入图片描述
事实上IEnumerator GetEnumerator()正常思维应该是返回一个IEnumerator类型的参数,也就是迭代器。
这是我们平常的思路。但是这样做就有个问题。这儿要new一个List,或者任何实现了IEnumerable接口的类型。这样也太麻烦了吧。要知道IEnumerable是一个常用的返回类型。每次使用都要new一个LIst,或者其他实现了该接口的类型。与其使用其他类型,不如我们自己定制一个实现了IEnumerable接口专门用来返回IEnumerable类型的类型。我们自己定制也很麻烦。所以微软帮我们定制好了。这个类是什么,那就是yield这个关键字。

自己实现迭代器

public class MyIEnumerable : IEnumerable
    {
    
    
        private string[] strlist;

        public MyIEnumerable(string[] strlist)
        {
    
    
            this.strlist = strlist;
        }

        public IEnumerator GetEnumerator()
        {
    
    
            return new MyIEnumerator(strlist);//返回实现了IEnumerator接口的类MyIEnumerator
        }
    }
    public class MyIEnumerator : IEnumerator
    {
    
    
        private string[] strlist;
        private int position;

        public MyIEnumerator(string[] strlist)
        {
    
    
            this.strlist = strlist;
            this.position = -1;
        }

        public object Current
        {
    
    
            get {
    
     return strlist[position]; }//获得迭代器当前的位置
        }

        public bool MoveNext()
        {
    
    
            position++;
            if (position < strlist.Length)
            {
    
    
                return true;
            }
            else return false;
        }

        public void Reset()
        {
    
    
            position = -1;
        }
    }

在这里插入图片描述
与下面实现的结果是一样的
在这里插入图片描述

yield帮我们简化了实现IEnumerator的步骤。

参考博客:
https://www.cnblogs.com/santian/p/4389675.html
https://www.cnblogs.com/zhaopei/p/5769782.html

猜你喜欢

转载自blog.csdn.net/qq_51533157/article/details/125939000