IEnumerableインタフェースの簡単な例

3217 ワード

回転:https://blog.csdn.net/wang371756299/article/details/8197075
要旨:IEnumerableインタフェースはforeachループを実現する重要なインタフェースであり、配列、集合などforeachループでその中の各要素を遍歴できるのは、彼らがIEnumerableインタフェースを実現したからであり、このインタフェースはいったいどのように動作しているのか、次の例で得ることができる...
 
IEnumerableインタフェースはforeachループを実現する重要なインタフェースであり、配列、集合などforeachループでその各要素を遍歴できるのは、IEnumerableインタフェースを実現しているからであり、このインタフェースはどのように動作しているのか、次の例を通じていくつかのヒントを得ることができる.
このような簡単なクラスを定義します.
01.public class Person  
02.    {  
03.        private string[] names= new string[] { "A", "B", "C" };  
04.    }  

names属性はプライベート属性であるため、Personクラスのオブジェクトからアクセスすることができず、遍歴することもできず、PersonクラスにIEnumerableインタフェースを実装して遍歴させることができ、インタフェースを実装したクラスは以下の通りである.
01.public class Person : IEnumerable  
02.    {  
03.        private string[] names= new string[] { "A", "B", "C" };  
04.       
05.        public IEnumerator GetEnumerator()  
06.        {  
07.              
08.        }   
09.    }  

IEnumerableインタフェースが実装された後、PersonクラスにはGetEnumerator関数が実装されなければなりません.この関数はIEnumeratorのタイプのオブジェクトを返し、IEnumeratorインタフェースから継承されたクラスを書きます.
01.public class PersonEnumerator : IEnumerator  
02.   {  
03.       //           
04.       private string[] _names;  
05.  
06.       //        
07.       private int index = -1;  
08.  
09.       //    ,             
10.       public PersonEnumerator(string[] temp)  
11.       {  
12.           _names = temp;  
13.       }  
14.  
15.       //         names        
16.       public object Current  
17.       {  
18.           get { return _names[index]; }  
19.       }  
20.  
21.       //  ,          
22.       public bool MoveNext()  
23.       {  
24.           index++;  
25.           if (index < _names.Length)  
26.           {  
27.               return true;  
28.           }  
29.           else  
30.               return false;  
31.       }  
32.  
33.       //      ,         
34.       public void Reset()  
35.       {  
36.           index = -1;  
37.       }  
38.   }  

GetEnumerator関数を少し修正すると、次のようになります.
01.public class Person : IEnumerable  
02.   {  
03.       private string[] names = new string[] { "A", "B", "C" };  
04.      
05.       public IEnumerator GetEnumerator()  
06.       {  
07.           //  PersonEnumerator      , Person   names        
08.           return new PersonEnumerator(names);  
09.       }   
10.   }  

次に、Personクラスのオブジェクトをforeachで巡回できます.
01.static void Main(string[] args)  
02.        {  
03.            Person p1 = new Person();  
04.            foreach (string item in p1)  
05.            {  
06.                Console.WriteLine(item);  
07.            }  
08.            Console.ReadKey();  
09.        }  

names配列を次の方法で巡回することもできます.
01.static void Main(string[] args)  
02.       {  
03.           Person p1 = new Person();  
04.           IEnumerator rator = p1.GetEnumerator();  
05.           while (rator.MoveNext())  
06.           {  
07.               Console.WriteLine(rator.Current);  
08.           }  
09.           Console.ReadKey();  
10.       }