我目前正在学习 C#,目的是有效地使用 Razor 和 Umbraco,我有一点 PHP 背景和 JavaScript 的合理知识。

我遇到了 IEnumerator 接口(interface),但很难理解它。我在下面设置了一个代码片段来演示使用 foreach 遍历数组:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace cardEnum
{
    class suitsEnumerator
    {
        private static string[] suits = { "Hearts", "Spades", "Diamonds", "Clubs" };
        public void showAll()
        {
            foreach(string x in suits){
                System.Console.WriteLine(x);
            }
        }
    }
    class run
    {
        static void Main()
        {
            Console.WriteLine("The suits are:");
            var suits = new suitsEnumerator();
            suits.showAll();
            Console.ReadKey();
        }
    }
}

有人可以解释为什么我什至需要使用 IEnumerator 否则我可以很容易地遍历数组。我知道这是一个如此简单的问题,我只是想不出使用 IEnumerable 的理由。

任何帮助都将不胜感激,谢谢!

最佳答案

这就是在您的示例中实现枚举器模式的方式。我希望这能澄清一些事情,特别是 IEnumerableIEnumerator 之间的关系:

namespace cardEnum {
    // simple manual enumerator
    class SuitsEnumerator : IEnumerator {
        private int pos = -1;
        private static string[] suits = { "Hearts", "Spades", "Diamonds", "Clubs" };

        public object Current {
            get { return suits[pos]; }
        }

        public bool MoveNext() {
            pos++;
            return (pos < suits.Length);
        }

        public void Reset() {
            pos = -1;
        }
    }

    class Suits : IEnumerable {
        public IEnumerator GetEnumerator() {
            return new SuitsEnumerator();
        }
    }

    class run {
        static void Main() {
            Console.WriteLine("The suits are:");
            var suits = new Suits();
            foreach (var suit in suits) {
                Console.WriteLine(suit);
            }
            Console.ReadKey();
        }
    }
}

当然,这是一个帮助理解的人为例子。由于 string[] 已经实现了 IEnumerable ,因此没有理由重新发明轮子。

由于 C# 支持 yields 关键字,因此最近创建 Enumerator 变得容易一些:
namespace cardEnum {
    // no explicit SuitsEnumerator required
    class Suits : IEnumerable {
        public IEnumerator GetEnumerator() {
            yield return "Hearts";
            yield return "Spades";
            yield return "Diamonds";
            yield return "Clubs";
        }
    }

    class run {
        static void Main() {
            Console.WriteLine("The suits are:");
            var suits = new Suits();
            foreach (var suit in suits) {
                Console.WriteLine(suit);
            }
            Console.ReadKey();
        }
    }
}

关于c# - 无法理解 IEnumerator,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7983027/

10-10 19:52