【问题标题】:When is custom enumerable/collection useful?自定义可枚举/集合何时有用?
【发布时间】:2010-12-08 16:15:13
【问题描述】:

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

示例

1 次

class NumberArray
{
    public int[] scores;

    public NumberArray()
    {
    }

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

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

}

参加 2 次​​strong>

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 次中,我按照自定义迭代来迭代与我在第 2 次中所做的相同的整数数组 采取 1. 为什么我要绕过丛林使用自定义迭代来迭代整数

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

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

【问题讨论】:

  • 抱歉:我回答了您提出的问题,而不是您的意思。由于我的回答不受欢迎,我已投票删除它们。
  • 对不起。我已经做了一般性声明。不要当真。很酷。

标签: c# enumerable design-consideration


【解决方案1】:

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

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

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

查看真实示例:enumerate lines on a file。这里,在foreach 循环的每次迭代中从文件中读取每一行。 (附带说明一下,.NET Framework 4 提供了同样的内置功能)。

【讨论】:

【解决方案2】:

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

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

此外,由于 C# 2 中对迭代器的支持,实际上没有理由手动实现 IEnumerable。请参阅此问题以获取更多详细信息Can someone demystify the yield keyword?

【讨论】:

  • 我从某个站点获取的那些示例。所以我不明白自定义迭代的好处。我想知道“这是自定义迭代非常方便”的场景。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多