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

时间:2009-10-21 10:58:24

标签: 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;}
    }

}

选择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.为什么我应该通过使用自定义迭代来击败灌木来迭代整数?

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

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

3 个答案:

答案 0 :(得分:6)

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

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

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

请参阅此处查看实际示例:enumerate lines on a file。这里,在foreach循环的每次迭代中从文件中读取每一行。 (作为旁注,.NET Framework 4内置了相同的功能)。

答案 1 :(得分:3)

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

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

此外,由于支持C#2中的迭代器,因此没有理由手动实现IEnumerable。有关其他详细信息Can someone demystify the yield keyword?

,请参阅此问题

答案 2 :(得分:2)

正如另一个自定义迭代过去对我有用的例子是提供一个通用的抽象来递归地枚举树结构中的所有节点......

foreach (Node n in tree)
  //...do something