分不清IEnumerable和IEnumerator
阿新 • • 發佈:2021-01-19
技術標籤:C# 基礎知識
首先看幾個單詞
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 結果