zoukankan      html  css  js  c++  java
  • foreach循环遍历和yeild关键字

        如果一个类型的对象,想要在foreach中可以遍历,该类型必须有一个方法:IEumerator  GetEnumerator(),一般做法是让该类型实现IEnumeralbe接口,则该类型中必然就有GetEnumerator()方法了。GetEnumerator()的返回值是IEnumerator类型。然后写一个类型,该类型实现了IEnumerator接口的类,在GetEnumerator()方法中返回这个类型的对象。其中,实现IEnumerable接口的类型即为可枚举类型,实现IEnumerator接口的类型为枚举器。yield关键字便实现了对对象的遍历。

        例如:

      

          namespace _foreach循环遍历原理

             {    

                   class Program    

                  {        

                        static void Main(string[] args)        

                           {            

                              Person p1 = new Person();

                              foreach (var item in p1)  

                                 {                

                                     Console.WriteLine(item);

                                 }

                               Console.ReadKey();        

                }   

          }

          public class Person : IEnumerable<string>
         {
            private string[] _names = { "aa", "bb", "cc", "dd" };
            public string Name
            {
                get;
                set;
            }
            public int Age
            {
                get;
                set;
            }
            public string Email
            {
                get;
                set;
            }

             public IEnumerator<string> GetEnumerator()        

                 {            

                             for (int i = 0; i < _names.Length; i++)            

                                 {                               

                                         yield return _names[i];

                                         if (_names[i] == "aa")                

                                           {                    

                                                  yield break;                

                                            }                

                                           else                

                                          {                    

                                                    yield return _names[i];                

                                          }            

                                 }        

                          }

        注意:foreach循环遍历是只读的,不能用来修改数据。

                 foreach遍历类型推断为object而不是实际类型,需要实现泛型版本的接口。

                 当yield语句所在的方法的返回值为IEnumerable<T>时,表示自动生成一个可迭代类型。

                 当yield语句所在的方法的返回值为IEnumerator<T>时,表示自动生成一个迭代器

        

            

            

  • 相关阅读:
    单链表反转的2种常见方法
    LeetCode解题报告:Reorder List
    LeetCode解题报告:Binary Tree Postorder Traversal
    LeetCode解题报告:LRU Cache
    LeetCode解题报告:Insertion Sort List
    Java编程杂记
    如何对一个不断更新的HashMap进行排序
    Python快速入门
    Html与CSS快速入门01-基础概念
    JVM快速入门
  • 原文地址:https://www.cnblogs.com/hanwenhuazuibang/p/2965183.html
Copyright © 2011-2022 走看看