3

在访问了不同的网站以尝试了解使用自定义枚举的实时示例后,我放弃了这一行。我有例子。但它们让我感到困惑。

例子

拿 1

class NumberArray
{
    public int[] scores;

    public NumberArray()
    {
    }

    public NumberArray(int[] scores)
    {
        this.scores = scores;
    }

    public int[] Scores
    {
        get {return scores;}
    }

}

拿 2

public class Enumerator : IEnumerator
{
    int[] scores;
    int cur;
    public Enumerator(int[] scores)
    {
        this.scores = scores;
        cur = -1;
    }
    public Object Current
    {
        get {
            return scores[cur];
        }
    }

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

    public bool MoveNext()
    {
        cur++;
        if (cur < scores.Length)
            return true;
        else return false;
    }
}

public class Enumerable : IEnumerable
{
    int[] numbers;

    public void GetNumbersForEnumeration(int[] values)
    {
        numbers = values;
        for (int i = 0; i < values.Length; i++)
            numbers[i] = values[i];
    }

    public IEnumerator GetEnumerator()
    {
        return new Enumerator(numbers);
    }
}

主要的

static void Main()
{
    int[] arr = new int[] { 1, 2, 3, 4, 5 };
    NumberArray num = new NumberArray(arr);
    foreach(int val in num.Scores)
    {
        Console.WriteLine(val);
    }

    Enumerable en = new Enumerable();
    en.GetNumbersForEnumeration(arr);

    foreach (int i in en)
    {
        Console.WriteLine(i);
    }
    Console.ReadKey(true);
}

在第 2 次中,我按照自定义迭代来迭代与第 1 次中相同的整数数组。为什么我要绕过灌木丛来使用自定义迭代来迭代整数

可能我错过了实时自定义迭代需求。你能解释一下我不能用现有的迭代工具完成的任务吗?(我刚毕业,举个简单的例子,让我能正确理解)。

更新: 我从一些网站上拿了这些例子。该代码没有什么特别之处,即使不使用自定义迭代,我们也可以非常简单地实现它,我的兴趣是了解自定义迭代非常方便的真实场景。

4

3 回答 3

6

当您正在迭代的资源没有预先加载到内存中,而是在每次迭代中根据需要获取时,自定义迭代器非常有用。例如,在 LINQ to SQL 中,当您执行以下操作时:

foreach(var employee in dataContext.Employees) {
    // Process employee
}

foreach循环的每一步中,都会查询数据库中的Employees表以获取下一条记录。这样,如果您提前退出循环,您还没有读取整个表,而只是读取了您需要的记录。

有关真实示例,请参见此处:枚举文件上的行。在这里,在循环的每次迭代中从文件中读取每一行foreach。(附带说明,.NET Framework 4 提供了相同的内置功能)。

于 2009-10-21T11:09:07.233 回答
3

老实说,我不完全确定您在问什么,但是如果您担心返回数组(如第 1 次)和返回迭代器(第 2 次)之间的区别,这就是我的答案。

返回数组和返回迭代器之间有很大的区别。返回数组意味着返回内部状态(除非您将副本作为返回的一部分,但这很昂贵)。如果你返回一个迭代器,你只返回一个抽象,它会让调用者迭代状态。这也意味着,如果需要,您可以进行惰性求值(如果您要返回数组,您显然不能这样做)。

此外,由于 C# 2 中对迭代器的支持,实际上没有理由手动实现 IEnumerable。请参阅此问题以获取更多详细信息有人可以揭开 yield 关键字的神秘面纱吗?

于 2009-10-21T11:09:45.793 回答
2

就像过去自定义迭代对我有用的另一个示例一样,它提供了一个通用抽象来递归枚举树结构中的所有节点......

foreach (Node n in tree)
  //...do something
于 2009-10-21T11:22:34.970 回答