ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

foreach和IEnumerable+yield和IEnumerator

2022-02-07 20:33:45  阅读:160  来源: 互联网

标签:arr string IEnumerable yield foreach var IEnumerator


  C#里,foreach可以算是个高一等级的循环,因为想要使用foreach必须实现IEnumberable,然后还需要在这个接口的唯一方法中,用yield return返回元素,才能达到foreach的循环效果。

 class MyList : IEnumerable
 {
     string[] arr = new string[] { "a", "b", "c" };
     public IEnumerator GetEnumerator()
     {
         for (var i = 0; i < arr.Length; i++)
         {
             yield return arr[i];
         }
     }
 }

  然后直接调用

var myEnumerable = new MyList();
foreach (var e in myEnumerable)
{
    WriteLine(e);
}

  如果我们剥离一层,把foreach和IEnumberable剥离了,看看会是什么样的效果,这次,不去实现IEnumerable,只是定义了一个返回IEnumberator的方法,用yield返回

class Itmes
{
    string[] arr = new string[] { "a", "b", "c" };
    public IEnumerator GetItem()
    {
        for (var i = 0; i < arr.Length; i++)
        {
            yield return arr[i];
        }
    }
}

  同样在调用的时间,没有foreach,为了更清楚的看清逻辑,这里换成了while对IEnumerator的操作,yield return后,返回的类型被封装在了IEnumerator中。如果通过获取当前值用Current,后移索引值用MoveNext,以方便来取下一个元素的值,也就是说,真正实现了控制取值的效果。

var item = new Itmes().GetItem();
while (item != null && item.MoveNext())
{
    WriteLine(item.Current);
}        

  至于IEnumberable的作用,就是可以把一个对象,置于foreach语法中,这个对象看上去更像一个集合序列了:foreach (var e in myEnumerable)中的 myEnumberable就是这个集合序列,但本质上元素是在string[]中放着。

 

  想要更快更方便的了解相关知识,可以关注微信公众号  

 

 

标签:arr,string,IEnumerable,yield,foreach,var,IEnumerator
来源: https://www.cnblogs.com/ljknlb/p/15869056.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有