جار الترجمة "عائد العائد" إلى VB


مرحبًا بالجميع، لدي مشكلة ترجمة أخرى لا يمكن أن تساعدني حتى – chat.openai.com -، فأنا أستخدم vb 2010، وأعلم جيدًا أنه من إصدار 2012، أصبح “العائد” مدعومًا، ولكن من أجل التوافق لا بد لي من استخدام نسخة 2010. هل هناك بديل غير بعيد المنال للتغلب على المشكلة؟ رمز على النحو التالي:

ج #
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;
         }

أتمنى مساعدتكم وشكرا.

ما حاولت:

لقد جربت ذلك، لكنه لم ينجح، البرنامج يتعطل وأعد تشغيل 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

الحل 2

لن أقول إنها “لم تكن مهمة بسيطة”، بل تم تنفيذها بطريقة مختلفة عن لغة C#. هنا هو كيف: المكرر – فيجوال بيسك | مايكروسوفت تعلم[^]

لذلك، على سبيل التخمين (لم يتم اختباره)، يجب أن يكون إصدار VB.Net:

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

الحل 3

كانت هناك فترة حيث yield كان متاحا في C# ولكن ليس في vb. إذا كان هذا هو الحال في عام 2010، فتحقق مما إذا كان IEnumerable كانت الواجهة متاحة في vb في 2010؟

إذا IEnumerable كانت الواجهة متاحة في vb في عام 2010، يمكنك تنفيذ تلك الواجهة للفصل الذي تقوم بإنشائه لإنشاء ملف Yield مثل الوظيفة. يرى هذا المقال[^]، الأمر ليس بهذه الصعوبة في الواقع.

إذا IEnumerable الواجهة لم تكن متوفرة في vb في عام 2010، إما راجع إجابة OriginalGriff أو قم بتنفيذ الكود أدناه ولكن قم بإزالة كافة تطبيقات الواجهة. عدم تنفيذ الواجهات يعني أنك لن تتمكن من استخدامها For ... Each لكن ال While .MoveNext() = True يجب أن يظل الكود يعمل – يتم تضمين الأمثلة أدناه.

على سبيل المثال (لم أختبر هذا الرمز لذا ستكون هناك أخطاء إملائية يسهل إصلاحها).
أولاً، تقوم بإنشاء فئة جديدة يمكن تعدادها (implements IEnumerable). تصف المقالة التي قمت بربطها أعلاه كل هذا بالتفصيل ولكن في جوهرها تنفذ الفئة الجديدة IEnumerable مما يعني أنه يجب أن يكون لديه القدرة على إنشاء وإرجاع كائن يتم تنفيذه 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

ثم نقوم بإنشاء العداد الذي سيتم استخدامه بواسطة الكائن القابل للإحصاء. يمكنك أن ترى أن مجموعة الأعداد الصحيحة يتم تمريرها تدريجيًا من التعليمات البرمجية الخاصة بك إلى ملف IEnumerable الكائن ثم IEnumerator هدف. عليك أن تقرر ما إذا كان يجب أن تكون نسخًا ضحلة (حسب المرجع) أو نسخًا عميقة (من حيث القيمة) بناءً على احتياجاتك.

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

ثم قم بتعديل الكود الأصلي الخاص بك لاستخدام هذه الفئة الجديدة. لاحظ أن هناك طريقتين للقيام بالتعداد

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

ثم تحتاج إلى تنفيذ IEnumerator واجهة ل ThingEnumerator فصل.

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

الحل 1

انظر هنا: https://stackoverflow.com/questions/2912851/what-is-the-equivalent-syntax-in-vb-net-for-yield-return[^]

ليست مهمة بسيطة على الإطلاق..

コメント

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