【发布时间】:2011-04-18 05:11:52
【问题描述】:
首先我必须假设我对 C# yield 关键字及其功能不是很熟悉。 将其“翻译”成 VB.NET 的最佳/最简单方法是什么? 特别是我试图将this code 转换为VB.NET,但我失败了:
yield return new MatchNode(++index, current.Value);
我拥有的是:
Imports System.Collections
Imports System.Data.SqlTypes
Imports System.Diagnostics.CodeAnalysis
Imports System.Text.RegularExpressions
Imports Microsoft.SqlServer.Server
Class MatchNode
Private _index As Integer
Private _value As String
Public Sub New(ByVal index As Integer, ByVal value As String)
_index = index
_value = value
End Sub
Public ReadOnly Property Index() As Integer
Get
Return _index
End Get
End Property
Public ReadOnly Property Value() As String
Get
Return _value
End Get
End Property
End Class
Class MatchIterator
Implements IEnumerable
Private _regex As Regex
Private _input As String
Public Sub New(ByVal input As String, ByVal pattern As String)
MyBase.New()
_regex = New Regex(pattern, UserDefinedFunctions.Options)
_input = input
End Sub
Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
Dim index As Integer = 0
Dim current As Match = Nothing
While (current Is Nothing OrElse current.Success)
If current Is Nothing Then
current = _regex.Match(_input)
Else
current = current.NextMatch()
End If
If current.Success Then
index += 1
'following should be a VB.Net yield'
Return New MatchNode(index, current.Value)
End If
End While
End Function
End Class
Partial Public Class UserDefinedFunctions
<SqlFunction(FillRowMethodName:="FillMatchRow", TableDefinition:="[Index] int,[Text] nvarchar(max)")> _
Public Shared Function RegexMatches(ByVal input As SqlChars, ByVal pattern As SqlString) As IEnumerable
Return New MatchIterator(New String(input.Value), pattern.Value)
End Function
Public Shared Sub FillMatchRow(ByVal data As Object, ByRef index As SqlInt32, ByRef text As SqlChars)
Dim node As MatchNode = CType(data, MatchNode)
index = New SqlInt32(node.Index)
text = New SqlChars(node.Value.ToCharArray)
End Sub
End Class
【问题讨论】:
-
我看到了他们,但我没有弄清楚如何做到这一点并错过了一个例子。
标签: c# vb.net ienumerable yield