在C#中IEnumerable与IEnumerator_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 在C#中IEnumerable与IEnumerator

在C#中IEnumerable与IEnumerator

 2013/8/18 19:28:47  magicyu  博客园  我要评论(0)
  • 摘要:对于很多刚开始学习C#同学来说经常会遇到IEnumerable这个关键字,enumerate在字典里的解释是列举,枚举,因此可想而知这个关键字肯定是和列举数据有关的操作。1publicinterfaceIEnumerable{//IEnumerable只有一个方法,返回可循环访问集合的枚举数。2IEnumeratorGetEnumerator()3;4}publicinterfaceIEnumerator{//方法5//移到集合的下一个元素。如果成功则返回为true;如果超过集合结尾
  • 标签:C#

对于很多刚开始学习C#同学来说经常会遇到IEnumerable这个关键字,enumerate在字典里的解释是列举,枚举,因此可想而知这个关键字肯定是和列举数据有关的操作。

 

 1 public interface IEnumerable {       //IEnumerable只有一个方法,返回可循环访问集合的枚举数。     
 2   IEnumerator GetEnumerator()  
 3 ; 
 4 } public interface IEnumerator {        // 方法      
 5  //移到集合的下一个元素。如果成功则返回为 true;如果超过集合结尾,则返回false。     
 6   bool MoveNext();    
 7   // 将集合设置为初始位置,该位置位于集合中第一个元素之前     
 8   void Reset();
 9       // 属性:获取集合中的当前元素     
10   object Current { get; }
11  }

看我们手动自定义的Student类,以及Student1,StudentEnum类(分别继承了IEnumerable,IEnumerator接口),上代码

  1 using System;
  2 using System.Collections;
  3 using System.Text;
  4 using System.Threading.Tasks;
  5 
  6 namespace Enumerate
  7 {
  8     public class Student
  9     {
 10 
 11 
 12         public string Name;
 13         public int Score;
 14         public Student(string name, int score)
 15         {
 16 
 17             this.Name = name;
 18             this.Score = score;
 19         }
 20     }
 21     
 22     public class Student1: IEnumerable {
 23 
 24 
 25         public Student[] students;
 26         public Student1(Student[] stArray)
 27         {
 28             students = new Student[stArray.Length];
 29             for (int i = 0; i < stArray.Length; i++)
 30             {
 31                 students[i] = stArray[i];
 32             }
 33         }
 34         public IEnumerator GetEnumerator()
 35         {
 36             //throw new NotImplementedException();
 37             return new StudentEnum(students);
 38         }
 39     }
 40 
 41     public class StudentEnum : IEnumerator
 42     {
 43         public Student[] students;
 44 
 45         int position = -1;
 46 
 47         public StudentEnum(Student[] studentlist)
 48         {
 49 
 50             students = studentlist;
 51         }
 52 
 53         public object Current
 54         {
 55             //get { throw new NotImplementedException(); }
 56             get {
 57 
 58                 try
 59                 {
 60                     return students[position];
 61                 }
 62                 catch (Exception ex)
 63                 {
 64 
 65                     return ex.Message;
 66                 }
 67             }
 68         }
 69 
 70         public bool MoveNext()
 71         {
 72             //throw new NotImplementedException();
 73             position++;
 74             return position >= students.Length ? false : true;
 75         }
 76 
 77         public void Reset()
 78         {
 79             //throw new NotImplementedException();
 80             position = -1;
 81         }
 82     }
 83 
 84 
 85     class Program
 86     {
 87         static void Main(string[] args)
 88         {
 89             Student[] studentArrary = new Student[2] { 
 90             
 91                 new Student("test1",100),
 92                 new Student("test2",100),
 93             };
 94             Student1 studenlist = new Student1(studentArrary);
 95             foreach (Student item in studenlist)
 96             {
 97 
 98                 Console.WriteLine(item.Name +" "+ item.Score);
 99                 
100             }
101             Console.Read();
102         }
103     }
104 }

IEnumerable和IEnumerator有什么区别

1、一个Collection要支持foreach方式的遍历,必须实现IEnumerable接口(亦即,必须以某种方式返回IEnumerator object)。
 
2、IEnumerator object具体实现了iterator(通过MoveNext(),Reset(),Current)。
 
3、从这两个接口的用词选择上,也可以看出其不同:IEnumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的,但并没有说明如何实现枚举器(iterator);IEnumerator是一个实现式的接口,IEnumerator object就是一个iterator。
 
4、IEnumerable和IEnumerator通过IEnumerable的GetEnumerator()方法建立了连接,client可以通过IEnumerable的GetEnumerator()得到IEnumerator object,在这个意义上,将GetEnumerator()看作IEnumerator object的传递方法。

 

 

 

 

发表评论
用户名: 匿名