什么时候自定义枚举/集合有用?

use*_*276 3 c# enumerable design-consideration

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

拿1

class NumberArray
{
    public int[] scores;

    public NumberArray()
    {
    }

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

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

}
Run Code Online (Sandbox Code Playgroud)

拿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);
    }
}
Run Code Online (Sandbox Code Playgroud)

主要

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);
}
Run Code Online (Sandbox Code Playgroud)

在第2部分中,我按照自定义迭代迭代相同的整数数组,就像我在第1部分中所做的那样.为什么我应该通过使用自定义迭代来尝试迭代整数

可能我错过了实时自定义迭代需求.你能解释一下我不能用现有的迭代工具做的任务吗?(我刚完成学业,所以给我一个简单的例子,这样我就能理解它).

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

Kon*_*man 6

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

foreach(var employee in dataContext.Employees) {
    // Process employee
}
Run Code Online (Sandbox Code Playgroud)

foreach循环的每个步骤中,查询数据库中的Employees表以获取下一条记录.这样,如果您提前退出循环,则不会读取整个表,而只会读取所需的记录.

请参阅此处获取实际示例:枚举文件中的行.这里,在foreach循环的每次迭代中从文件中读取每一行.(作为旁注,.NET Framework 4提供了内置的相同功能).

  • 它作为状态机检查这些链接很有用:http://blogs.msdn.com/matt_pietrek/archive/2004/07/26/197242.aspx和http://bigballofmud.wordpress.com/2009/03/ 21 /创建-简单状态机-使用-C-20-迭代器/ (2认同)