1. 程式人生 > 其它 >分不清IEnumerable和IEnumerator

分不清IEnumerable和IEnumerator

技術標籤: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 結果

在這裡插入圖片描述