长期以来使用VB的人都羡慕使用C#的人,能用上yield return关键字,实现下面集合操作的便捷写法
public int[] items;
public IEnumerable BuildCollection()
{
for (int i = 0; i < items.Length; i++)
{
yield return items[i];
}
}
在以前的VB版本中如果要使用迭代器需要参考一文中的别扭写法
Dim lines = New GenericIterator(Of String) _
(Function(ByRef nextItem As String) As Boolean
nextItem = rdr.ReadLine
Return nextItem IsNot Nothing
End Function)
但是到了现在VB11已经提供了Iterator、Yield关键字一起变得美好起来,这两个关键字的具体用法
Private Iterator Function SomeNumbers() As IEnumerable
' Use multiple yield statements.
Yield 3
Yield 5
Yield 8
End Function
Sub Main()
For Each number As Integer In SomeNumbers()
Console.Write(number & " ")
Next
' Output: 3 5 8
Console.ReadKey()
End Sub
这样本文第一个C#的代码段就可以直接改写成
Public items() As Integer
Public Iterator Function BuildCollection() As IEnumerable
For i = 0 To items.Length - 1
Yield items(i)
Next
End Function
这样一来VB的迭代器的书写难度和性能就和C#毫无区别了
另外,算神还发现VB的迭代器还支持匿名函数的写法
Sub TestIterator()
Dim a = Iterator Function()
For i = 1 To 10
If i Mod 3 = 0 Then
Yield i
End If
Next
End Function
For Each j In a()
Console.WriteLine(j)
Next
End Sub
与之对应的C#5还不支持,VB这次又超前于C#了
相对可惜的是VB11只支持Win7以上系统,对于还在使用XP开发的朋友是一道门槛
不过算神在这告诉一个好消息,这两个新关键字已经装载在Visual Studio Async CTP (SP1 Refresh)中,正在使用VS2010的朋友可以通过安装此包来获取体验到这个新语法