[ad_1]
مرحبًا بالجميع، لدي مشكلة ترجمة أخرى لا يمكن أن تساعدني حتى – 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…
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:
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
.
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
هدف. عليك أن تقرر ما إذا كان يجب أن تكون نسخًا ضحلة (حسب المرجع) أو نسخًا عميقة (من حيث القيمة) بناءً على احتياجاتك.
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
ثم قم بتعديل الكود الأصلي الخاص بك لاستخدام هذه الفئة الجديدة. لاحظ أن هناك طريقتين للقيام بالتعداد
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
فصل.
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[^]
ليست مهمة بسيطة على الإطلاق..
[ad_2]
コメント