zoukankan      html  css  js  c++  java
  • 如何让一个类可以被foreach枚举?

    答:实现IEnumerable或其IEnumerable<T>。该接口只有一个函数 public IEnumerator GetEnumerator();

    在这里,IEnumerator也是一个接口,我们将实现该接口的类称之为枚举数(enumerator)。

    也就是说,任何一个可以被枚举的类型,都可以通过GetEnumerator()得到这个枚举数;反过来,任何一个类型,若想要其能被枚举,那么必须实现IEnumerator接口的GetEnumerator()方法。

    那么,如何实现GetEnumerator?

    下面是三个版本的例子

    例子1:非泛型

    class Program
        {
            static void Main(string[] args)
            {
    
                MyColors myColors=new MyColors();
                foreach (var myColor in myColors)
                {
                    Console.WriteLine(myColor);
                }
                Console.Read();
    
    
            }
        }
        class ColorEnumerator : IEnumerator
        {
            private string[] Colors;
            int position = -1;
            public bool MoveNext()
            {
                position++;
                if (position<Colors.Count())
                {
                    return true;
                }
                return false;
            }
    
    
            public void Reset()
            {
                position = -1;
    
            }
            public object Current { get { return Colors[position]; } }
            public ColorEnumerator(string[] theColors)
            {
                Colors = new string[theColors.Count()];
                for (int i = 0; i < theColors.Count(); i++)
                {
                    Colors[i] = theColors[i];
                }
            }
    
        }
        class MyColors : IEnumerable
        {
            private string[] Colors = {"Red","Yellow","Blue"};
            public IEnumerator GetEnumerator()
            {
                return new ColorEnumerator(Colors);
            }
        }

    例子二(泛型的方法):

     class ColorEnumerator : IEnumerator<string>
        {
            private string[] Colors;
            int position = -1;
            public bool MoveNext()
            {
                position++;
                if (position<Colors.Count())
                {
                    return true;
                }
                return false;
            }
    
    
            public void Reset()
            {
                position = -1;
    
            }
    
            object IEnumerator.Current
            {
                get { return Current; }
            }
    
            public string Current
            {
                get { return Colors[position]; }
            }
    
            public ColorEnumerator(string[] theColors)
            {
                Colors = new string[theColors.Count()];
                for (int i = 0; i < theColors.Count(); i++)
                {
                    Colors[i] = theColors[i];
                }
            }
    
            public void Dispose()
            {
    
            }
        }
     class MyColors : IEnumerable<string>
        {
            private string[] Colors = { "Red", "Yellow", "Blue" };
    
            public IEnumerator<string> GetEnumerator()
            {
                return new ColorEnumerator(Colors);
            }
    
            IEnumerator IEnumerable.GetEnumerator()
            {
                return GetEnumerator();
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
            
                MyColors myColors = new MyColors();
                foreach (var color in myColors)
                {
                    Console.WriteLine(color);
                }
                Console.Read();
            }
        }

    例子三(迭代器方法):

        class MyColors : IEnumerable
        {
    
            public IEnumerator GetEnumerator()
            {
                yield return "Blue";
                yield return "Yellow";
                yield return "Red";
            }
    
        }
  • 相关阅读:
    web全栈第四讲:后端框架express.js初步体验。
    web全栈第三讲:Angular单页面应用
    Web第六讲:HTML基础
    关于命令模式的一点意见
    黑猫白猫读《大话设计模式》
    排序二叉树的实现和我的一个数据结构设计
    《算法与数据结构C语言描述》优先队列
    《算法与数据结构C语言描述》里的农夫过河
    读《算法与数据结构c语言描述》
    《算法与数据结构C语言描述》里的求多项达式值
  • 原文地址:https://www.cnblogs.com/Benjamin/p/4876990.html
Copyright © 2011-2022 走看看