[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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值