如何让一个类可以被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";
        }

    }
原文地址:https://www.cnblogs.com/Benjamin/p/4876990.html