为什么我们需要IEnumerator和IEnumerable?

Win*_*der 4 .net c# ienumerable ienumerator

好的,所以我只是通过IEnumeratorIEnumerable.现在MSDN说这些东西的主要目标是遍历客户集合.

很公平但我能够在不使用任何一个的情况下迭代自定义集合(或者至少我想这么认为)

namespace ienumerator
{

class person
{
    public person(string first, string second)
    {
        fname = first;
        lname = second;
    }
    public string fname { get; set; }
    public string lname { get; set; }
}

class person_list
{
    public person[] list;
    public person_list(person[] per)
    {
        list = new person[per.Length];
        for (int i = 0; i < per.Length; i++)
        {
            list[i] = per[i];
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        person[] names = new person[3]
        {
            new person("some","one"),
            new person("another","one"),
            new person("sss","ssdad"),
        };

        person_list list_of_names = new person_list(names);
        int i = 0;
        while (i < list_of_names.list.Length)
        {
            Console.WriteLine(list_of_names.list[i].fname);
            i++;
        }
        Console.Read();
    }
 }
}
Run Code Online (Sandbox Code Playgroud)

那么,在我的理解是有缺陷的,上面给我,我实现后达到同样的效果IEnumeratorIEnumerable.

Eri*_*ert 17

然而,我可以在不使用任何一个的情况下迭代自定义集合

当然,可以没有界面的情况下迭代自己的集合; 如果你不能,那你将如何实现界面?

作为代码实现者,不会为了方便而实现接口.您为了方便代码的使用者而实现它.界面意味着"关注客户:您可以枚举此集合的内容,而无需了解我如何实现它".

这就是界面的目的:它提供了一种抽象,允许代码的消费者使用它而无需了解它的工作原理.

  • @WinCoder:要么你正在编写这些类,期望它们将来会被零使用,或者将来会被使用一次或多次.如果您希望将来该类的使用次数为零,那么该类的作用并不重要,因为它永远不会被使用.如果您希望将来使用它一次或多次,那么使用该类的人就是消费者*.请注意,消费者可能在将来*自己*.现在做出有利于未来自我的选择. (6认同)
  • @EricLippert"IEnumerator就像一本书.IEnumerable就像一个读者." 这是你打算说的吗?听起来倒退了. (4认同)
  • @WinCoder:场景是:不是你想要使用你的类型的人.他们的任务是迭代集合的成员.你可以通过使用标准的IEnumerable/IEnumerator技术来实现它们,这样他们就不必学习一些新的,不同的技术来迭代你的集合. (3认同)
  • @WinCoder:然后问一个新问题!这就是这个网站的用途.但简而言之:IEnumerator就像一本书.IEnumerable就像一个读者.您可以让许多读者阅读同一本书,并且每个读者都在不同的页面上阅读. (2认同)