• 如何让一个类可以被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";
            }
    
        }
  • 相关阅读:
    vue.js 条件与循环
    vue.js 声明式渲染
    数据库设计范式?
    用户购物车,实现添加商品的功能!
    用户购物车功能的实现。
    初始ajax技术
    SQL语句中 INNER JOIN的用法!
    商城 用户登录、注册、注销,购物车。
    EL和 JSTL? 在JSP中简化 java代码的写法!
    小数点后保留2位小数的正则表达式
  • 原文地址:https://www.cnblogs.com/Benjamin/p/4876990.html
Copyright © 2020-2023  润新知