Dịch thuật "lợi nhuận" sang VB

lập trình


Xin chào mọi người, tôi có một vấn đề dịch thuật khác mà ngay cả – chat.openai.com – cũng không thể giúp được, tôi sử dụng vb 2010 và tôi biết rất rõ rằng từ phiên bản 2012 “năng suất” đã được hỗ trợ, nhưng để tương thích, tôi phải sử dụng phiên bản 2010. Có giải pháp thay thế nào không quá xa vời để giải quyết vấn đề không? Mã này như sau:

C#
public IEnumerable<Range> GetRanges(string regexPattern)
         {
             var range = new Range(this);
             range.SelectAll();
             //
             foreach (Range r in range.GetRanges(regexPattern, RegexOptions.None))
                 yield return r;
         }

Tôi hy vọng sự giúp đỡ của bạn và cảm ơn bạn.

Những gì tôi đã thử:

Tôi đã thử cách này nhưng không được, chương trình bị treo và tôi khởi động lại vb…

VB
Module Module1
     Sub Main()
         For Each number In GenerateNumbers(1, 5)
             Console.WriteLine(number)
         Next
         Console.ReadLine()
     End Sub

     Function GenerateNumbers(start As Integer, count As Integer) As Integer()
         Dim result(count - 1) As Integer
         For i As Integer = 0 To count - 1
             result(i) = start + i
         Next
         Return result
     End Function
End Module

Giải pháp 2

Tôi sẽ không nói rằng đó “không phải là một công việc đơn giản”, chỉ được thực hiện khác với C#. Đây là cách thực hiện: Trình vòng lặp – Visual Basic | Microsoft Tìm hiểu[^]

Vì vậy, theo phỏng đoán (chưa được kiểm tra), phiên bản VB.Net sẽ là:

VB
Public Iterator Function GetRanges(regexPattern As String) As IEnumerable(Of Range)
    Dim range As New Range(Me)
    range.SelectAll()
    
    For Each r As Range In range.GetRanges(regexPattern, RegexOptions.None)
        Yield r
    Next
End Function

Giải pháp 1

Xem ở đây: https://stackoverflow.com/questions/2912851/what-is-the-equivalent-syntax-in-vb-net-for-yield-return[^]

Một công việc không hề đơn giản chút nào…

Giải pháp 3

Đã có một thời kỳ mà yield đã có sẵn ở C# nhưng không ở trong vb. Nếu đó là trường hợp của năm 2010 thì hãy kiểm tra xem liệu IEnumerable giao diện đã có sẵn trong vb trong năm 2010?

Nếu IEnumerable giao diện đã có sẵn trong vb vào năm 2010 thì bạn có thể triển khai giao diện đó cho lớp bạn tạo để tạo một Yield như chức năng. Nhìn thấy bài viết này[^]thực ra nó không khó đến thế đâu.

Nếu IEnumerable giao diện không có sẵn trong vb vào năm 2010 thì hãy xem câu trả lời của OriginalGriff hoặc triển khai mã bên dưới nhưng xóa tất cả việc triển khai giao diện. Không triển khai giao diện có nghĩa là bạn sẽ không thể sử dụng For ... Each nhưng While .MoveNext() = True mã vẫn hoạt động – các ví dụ được bao gồm bên dưới.

Ví dụ: (Tôi chưa kiểm tra mã này nên sẽ có lỗi chính tả dễ sửa).
Đầu tiên bạn tạo một lớp mới có thể liệt kê được (triển khai IEnumerable). Bài viết tôi liên kết ở trên mô tả chi tiết tất cả những điều này nhưng về bản chất, lớp mới thực hiện IEnumerable có nghĩa là nó phải có khả năng tạo và trả về một đối tượng thực hiện IEnumerator.

VB
Public Class VBYield
    Implements IEnumerable(Of Integer)
    
    Private _enumerableobject As Integer()
    Private _thingenumerator As ThingEnumerator
    
    Public Sub New(EnumerableObject As Integer())
        Me._enumerableobject = EnumerableObject
    End Sub
    
    Public Function GetEnumerator() As IEnumerator(Of Double) Implements IEnumerable(Of Integer).GetEnumerator
        Return New ThingEnumerator(Me._enumerableobject)
    End Function
    
    ''' <summary>
    ''' [Use GetEnumerator instead]
    ''' </summary>
    Public Function GetEnumerator1() As IEnumerator Implements Collections.IEnumerable.GetEnumerator
        Return Me.GetEnumerator()
    End Function

Sau đó, chúng ta tạo bộ liệt kê sẽ được sử dụng bởi đối tượng đếm được. Bạn có thể thấy rằng mảng số nguyên được chuyển dần dần từ mã của bạn sang mã IEnumerable đối tượng và sau đó là IEnumerator sự vật. Bạn cần quyết định xem nó nên là bản sao nông (theo tham chiếu) hay sâu (theo giá trị) dựa trên nhu cầu của bạn.

VB
Public Class ThingEnumerator
    Implements IEnumerator(Of Integer)
 
    Private _enumerableobject As Integer()
    Private _index As Integer
    Private _curItem As Integer
    Private _lastItem As Integer
 
    Public Sub New(enumerableobject As Integer())
        Me._enumerableobject = enumerableobject
        Me._index = -1
        Me._curItem = Nothing
        Me._lastItem = enumerableobject.GetUpperBound(0)
    End Sub

Sau đó sửa đổi mã ban đầu của bạn để sử dụng lớp mới này. Lưu ý rằng có hai cách để thực hiện phép liệt kê

VB
Sub Main()
    'Create the object that can be enumerated
    Dim enumerablething As VBYield = New VBYield(GenerateNumbers(1,5))
    
    'There are two ways to enumerate the contents of our new object
    'This first way makes use of the fact that the object is enumerable (cannot use For Each if it isn't)
    For Each number As Interger in VBYield
        Console.WriteLine(number.ToString())
    Next
    
    'This second way ignorers the fact that the object is enumerable and accesses the methods of the enumerator object directlty
    'Use the enumerable object to get an enumerator object and then use MoveNext() and Current() to traverse its contents
    Dim enumeratorofthing As IEnumerator = VBYield.GetEnumerator()
    While enumeratorofthing.MoveNext() = True
        Console.WriteLine(enumeratorofthing.Current.ToString())
    End While

End Sub

Function GenerateNumbers(start As Integer, count As Integer) As Integer()
    Dim result(count - 1) As Integer
    For i As Integer = 0 To count - 1
        result(i) = start + i
    Next
    Return result
End Function

Sau đó, bạn cần triển khai IEnumerator giao diện cho ThingEnumerator lớp học.

VB.NET
Public ReadOnly Property Current As Double Implements IEnumerator(Of Integer).Current
    Get
        If IsNothing(Me._curItem) Then
            Throw New InvalidOperationException()
        End If
        Return Me._curItem
    End Get
End Property

Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
    If Me._index = Me._lastItem Then
        Return False
    End If
    Me._index += 1
    Me._curItem = Me._enumerableobject(Me._index)
    Return True
End Function

Public Sub Reset() Implements IEnumerator.Reset
    Me._index = -1
    Me._curItem = Nothing
End Sub

コメント

タイトルとURLをコピーしました