c#实现foreach

方式:

第一种,通过继承IEnumerable接口实现foreach语句。

     包括MoveNext、Reset函数和Current属性,以便GetEnumerator函数能获取枚举数。


第二种,用迭代器实现枚举器。

  • 迭代器是可以返回相同类型的值的有序序列的一段代码。

  • 迭代器可用作方法、运算符或 get 访问器的代码体。

  • 迭代器代码使用 yield return 语句依次返回每个元素。yield break 将终止迭代。有关更多信息,请参见 yield

  • 可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在 foreach 语句中被客户端代码调用,如下所示:foreach(int x in SampleClass.Iterator2){}

  • 迭代器的返回类型必须为 IEnumerable、IEnumerator、IEnumerable<T> 或 IEnumerator<T>。

yield 关键字用于指定返回的值。到达 yield return 语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。


  

 public class 鸡
    {
        int 身高;
        int 体重;
        int 三围;
        public 鸡(int _身高, int _体重, int _三围)
        {
            身高 = _身高;
            体重 = _体重;
            三围 = _三围;
        }
        public override string ToString()
        {
            return string.Format("我是一只鸡。我身高是:{0},我的体重是:{1},我的三围是{2}", 身高, 体重,三围); 
        }
    }

  
    public class 鸡群 : IEnumerator,IEnumerable
    {
       int position = -1;
        private 鸡[] ji;
        public 鸡群(鸡[] pArray)
        {
            ji = new 鸡[pArray.Length];
            for (int i = 0; i < pArray.Length; i++)
            {
                ji[i] = pArray[i];

            }
        }

        public bool MoveNext()
        {
            position++;
            return (position < ji.Length);
        }

        public void Reset()
        {
            position = -1;
        }

        public object Current
        {
            get
            {
                return ji[position];
            }
        }
        /// <summary>
        /// 返回一个循环访问集合的枚举器。
        /// </summary>
        /// <returns></returns>
        public IEnumerator GetEnumerator()
        {
            return new 鸡群(ji);
        }
    }

    class Program
    {
   
        static void Main(string[] args)
        {

            鸡[] jis = new 鸡[] 
            {
                new 鸡(10, 10,80),
                new 鸡(20, 20,90),
                new 鸡(30, 30,100),
            };

            鸡群 jiqun = new 鸡群(jis);

            foreach (var item in jiqun)
            {
                System.Console.WriteLine(item);
            }

            while (jiqun.MoveNext())
            {
                System.Console.WriteLine(jiqun.Current);
            }

            System.Console.ReadKey();

            鸡群2 jiqun2 = new 鸡群2(jis);

            foreach (var item in jiqun2)
            {
                System.Console.WriteLine(item);
            }
            System.Console.ReadKey();


        }
    }




    public class 鸡群2
    {
        private 鸡[] ji;

        public 鸡群2(鸡[] list)
        {
            ji = list;//引用类型
        }

        public IEnumerator GetEnumerator()
        {
            for (int i = 0; i < ji.Length; i++)
            {
                yield return ji[i];
            }
        }

    }


 






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

random_2011

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值