您的位置:首页 > 编程语言 > C#

c#实现foreach

2015-08-18 15:22 274 查看
方式:

第一种,通过继承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];
            }
        }

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: