分不清IEnumerable和IEnumerator

首先看几个单词

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 结果

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值