• 如何让一个类可以被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";
            }
    
        }
  • 相关阅读:
    Access restriction: The type BASE64Encoder is not accessible due to restrict(转载)
    ECLIPSE控制台信息导出
    ZUI分页器的使用案例(ECLIPSE SMS项目)
    关于PLSQL启动用时较长的问题解决
    javax.naming.NamingException: Cannot create resource instance报错修改
    百度AI人脸识别的学习总结
    ECharts3.0饼状图使用问题总结
    jni开发
    AndroidStudio封装jar并混淆
    Androidstudio代码混淆
  • 原文地址:https://www.cnblogs.com/Benjamin/p/4876990.html
Copyright © 2020-2023  润新知