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";
            }
    
        }
  • 相关阅读:
    react路由组件&&非路由组件
    react函数式组件(非路由组件)实现路由跳转
    react使用antd组件递归实现左侧菜单导航树
    【LeetCode】65. Valid Number
    【LeetCode】66. Plus One (2 solutions)
    【LeetCode】68. Text Justification
    【LeetCode】69. Sqrt(x) (2 solutions)
    【LeetCode】72. Edit Distance
    【LeetCode】73. Set Matrix Zeroes (2 solutions)
    【LeetCode】76. Minimum Window Substring
  • 原文地址:https://www.cnblogs.com/Benjamin/p/4876990.html
Copyright © 2011-2022 走看看