分不清IEnumerable和IEnumerator
首先看几个单词
Enum 枚举类型
IEnumerator 枚举器
IEnumerable 可枚举
从单词上大概可以看出IEnumerator是实际枚举器
查看源码
源码分析:
1 IEnumerable接口仅定义了一个返回IEnumerator类型的GetEnumerator方法
2 IEumerator接口定义了三个方法,Current获取当前的对象返回Object类型,MoveNext指针下移,Reset将指针重置
3 IEnumerator才是真正的集合遍历器,为了实现集合对象的遍历,必须实现IEnumerable接口
操作实例
1 定义实体类 球类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 namespace IEnumerableTest 2 { 3 class Ball 4 { 5 //编号 6 public int No { get; set; } 7 //颜色 8 public string Color { get; set; } 9 //球值 10 public string Data { get; set; } 11 } 12 }
2 定义BallEnum 继承IEnumerator,实现MoveNext,Reset,Current方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class BallEnum:IEnumerator 2 { 3 public Ball[] _ball; 4 int position = -1; 5 public BallEnum(Ball[] ball) 6 { 7 _ball=ball; 8 } 9 public bool MoveNext() 10 { 11 position++; 12 return (position < _ball.Length); 13 } 14 public void Reset() 15 { 16 position = -1; 17 } 18 public object Current 19 { 20 get { 21 try 22 { 23 return _ball[position]; 24 } 25 catch (IndexOutOfRangeException) 26 { 27 throw new InvalidOperationException(); 28 } 29 } 30 } 31 public void Dispose() 32 { 33 throw new NotImplementedException(); 34 } 35 }
3 定义实体类 摇奖机 继承接口IEnumerable 实现GetEnumerator方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class LotteryMachine:IEnumerable 2 { 3 private Ball[] _balls; 4 public LotteryMachine(Ball[]balls) 5 { 6 _balls = new Ball[balls.Length]; 7 for (int i = 0; i < balls.Length; i++) 8 { 9 _balls[i] = balls[i]; 10 } 11 } 12 IEnumerator IEnumerable.GetEnumerator() 13 { 14 return (IEnumerator)new BallEnum(_balls); 15 } 16 }
4 调用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //当前号码 2 int No; 3 //抽取次数 4 int times = 5; 5 StringBuilder sb = new StringBuilder(); 6 //添加球 7 Ball[] balls = new Ball[10]{ 8 new Ball() { No = 1, Color = "bule" ,Data="34"}, 9 new Ball() { No = 2, Color = "red" ,Data="21"}, 10 new Ball() { No = 3, Color = "black",Data="01" }, 11 new Ball() { No = 4, Color = "green",Data="03" }, 12 new Ball() { No = 5, Color = "yellow",Data="12" }, 13 new Ball() { No = 6, Color = "pink",Data="18" }, 14 new Ball() { No = 7, Color = "orange",Data="58" }, 15 new Ball() { No = 8, Color = "gray",Data="90" }, 16 new Ball() { No = 9, Color = "white",Data="45" }, 17 new Ball() { No = 10, Color = "purples",Data="00" }, 18 }; 19 //摇奖机,并把球放进去 20 LotteryMachine lotteryMachine = new LotteryMachine(balls); 21 //动起来 22 Random r = new Random(); 23 for (int i = 0; i < times; i++) 24 { 25 No = r.Next(1, balls.Length + 1); 26 foreach (Ball ball in lotteryMachine) 27 { 28 if (ball.No==No) 29 { 30 sb.Append(ball.Data); 31 } 32 } 33 if (i<times) 34 { 35 sb.Append(" "); 36 } 37 } 38 Console.WriteLine("本期中奖号码:"); 39 Console.WriteLine(sb.ToString()); 40 Console.ReadKey(); 41
5 结果