对于很多刚开始学习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的传递方法。