[ad_1]
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:
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…
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à:
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
.
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.
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ê
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.
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
[ad_2]
コメント