C# 自定义可枚举/集合何时有用?

C# 自定义可枚举/集合何时有用?,c#,enumerable,design-consideration,C#,Enumerable,Design Consideration,在访问了不同的网站,试图了解使用自定义枚举的实时示例后,我放弃了这一行。我有一些例子。但它们让我感到困惑 范例 拿1 拿2块 在take 2中,我按照自定义迭代来迭代与在中相同的整数数组 以1为例。为什么我要绕道而行,使用自定义迭代来迭代整数 可能我错过了实时定制迭代的需要。你能给我解释一下我不能用现有的迭代工具完成的任务吗?我刚完成学业,请给我举个简单的例子,以便我能正确地理解它 更新: 我从一些网站上取了这些例子。代码中没有什么特别之处,即使不使用自定义迭代,我们也可以非常简单地实现它,我的

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

范例

拿1

拿2块

在take 2中,我按照自定义迭代来迭代与在中相同的整数数组 以1为例。为什么我要绕道而行,使用自定义迭代来迭代整数

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

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

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

foreach(var employee in dataContext.Employees) {
    // Process employee
}
在foreach循环的每个步骤中,查询数据库中的Employees表以获取下一条记录。这样,如果您提前退出循环,就不会读取整个表,而是只读取所需的记录


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

老实说,我不完全确定您在问什么,但是如果您关心返回take 1中的数组和返回迭代器take 2中的数组之间的区别,下面是我的答案

返回数组和返回迭代器之间有很大的区别。返回数组意味着返回内部状态,除非作为返回的一部分创建一个副本,但这是昂贵的。若您返回一个迭代器,那个么您只需返回一个抽象,这将允许调用方迭代状态。这也意味着,如果您需要做一些在返回数组时显然不能做的事情,那么您可以进行延迟求值


此外,由于C2中对迭代器的支持,实际上没有理由手动实现IEnumerable。请查看此问题以了解更多详细信息

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

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

作为一个状态机,检查这些链接是很有用的:LINQtoSQL在迭代时实际上并不运行SELECTN+1,而是在请求第一个结果时加载所有记录,这是一个很好的例子+1担忧:我回答了你提出的问题,而不是你想回答的问题。由于我的回答不受欢迎,我投票删除了它们。对不起,我已经做了一般性的声明。不要把它当回事。很酷。这些例子我是从某个网站上拿的。所以我不明白定制迭代的好处。我想知道这个场景,这是定制迭代非常方便的地方。
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);
}
foreach(var employee in dataContext.Employees) {
    // Process employee
}
foreach (Node n in tree)
  //...do something