如何在不失去迭代器优势的情况下重载迭代器功能

时间:2018-07-24 09:04:06

标签: .net vb.net yield-return

由于我通常使用VB.net作为选择的语言,所以我还没有应付yield ing。现在我读到,他们也向VB.net引入了yield ing,所以我尝试学习它,现在我有一个问题。

假设我有一个使用Iterator ing的yield函数。出于这个问题,我创建了这个相当无用的函数:

Public Iterator Function Test(ByVal gap As Integer) As IEnumerable(Of Integer)
    Dim running As Integer

    Do While running < (Integer.MaxValue - gap)
        Yield running
        running += gap
    Loop
End Function

如果我对yield的理解正确,那么代码将在yield之后停止,并仅在要求下一项时继续。

因此,在我的示例中...如果获取running变量的下一个值将需要1秒,那么如果我只需要第一个数字,则我的代码将只运行1秒,并且它将运行5秒如果我需要5个数字。

到目前为止,还不错,但是现在我想重载我的函数:

Public Function Test() As IEnumerable(Of Integer)
    Return Test(1)
End Function

它不再是Iterator函数了,所以我失去了只需要很多时间就不需要数字的优势吗?

1 个答案:

答案 0 :(得分:2)

  

它不再是Iterator函数了,所以我失去了只需要很多时间就不需要数字的优势吗?

您没有。迭代器功能并不是万能的,它们所做的只是为您提供实现IEnumerable(Of T)接口的便捷方法。因此,要获得仅产生所需值的优势,您所需要的只是一种返回该接口的良好实现的方法。那可能是以下任何一种:

  • 迭代器方法,例如您的Test(ByVal gap As Integer)
  • 一种调用迭代器方法并返回其生成的对象的方法,例如Test()
  • 一种返回类型实例的方法,该实例可以手动实现IEnumerable(Of T)接口。