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";
            }
    
        }
  • 相关阅读:
    字节
    服务器每个网站占用资源
    in exists 条件查询
    NUnit2.0详细使用方法
    敏捷方法之极限编程(XP)和 Scrum区别
    学习内容及计划
    关于查看网页源文件不显示源代码(打开的是桌面文件夹)的问题
    用JS取float型 小数点 后两位
    [转]什么是CMMI?
    六月新版微软一站式示例代码库发布 新增20个Windows示例代码
  • 原文地址:https://www.cnblogs.com/Benjamin/p/4876990.html
Copyright © 2011-2022 走看看