如何在不失去迭代器优点的情况下重载迭代器函数



由于我通常使用VB.net作为我选择的语言,所以我还没有处理yielding。现在我读到,他们也把yielding引入了VB.net,所以我试着了解它,现在我有一个问题。

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

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

如果我正确理解了yielding,那么代码在yielding之后停止,只有在要求下一个项目时才继续。

所以,在我的例子中。。。如果获得running变量的下一个值需要1秒,那么如果我只需要第一个数字,我的代码将只运行1秒,如果我需要5个数字,它将运行5秒。

到目前为止,还不错,但现在我想超载我的功能:

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

它不再是Iterator函数了,所以我是否失去了只需要和数字一样多的时间的优势?

它不再是迭代函数了,所以我是否失去了只需要和数字一样多的时间的优势?

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

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

相关内容

最新更新