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