在C#中IEnumerable与IEnumerator

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

 

 

 

 

转载于:https://www.cnblogs.com/magicyu/p/3265311.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值