अनुवाद करना "उपज वापसी" वीबी को


सभी को नमस्कार, मेरे पास एक और अनुवाद समस्या है जो – 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;
         }

मुझे आपकी सहायता की आशा है और धन्यवाद।

मैंने क्या प्रयास किया है:

मैंने यह कोशिश की, लेकिन यह काम नहीं करता, प्रोग्राम क्रैश हो जाता है और मैं वीबी को पुनरारंभ करता हूं…

वी.बी
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 में या तो ओरिजिनलग्रिफ का उत्तर देखें या नीचे दिए गए कोड को लागू करें लेकिन सभी इंटरफ़ेस कार्यान्वयन को हटा दें। इंटीफेसेस को लागू न करने का मतलब है कि आप उपयोग नहीं कर पाएंगे For ... Each लेकिन While .MoveNext() = True कोड को अभी भी काम करना चाहिए – उदाहरण नीचे शामिल हैं।

उदाहरण के लिए (मैंने इस कोड का परीक्षण नहीं किया है इसलिए इसमें कुछ गलतियाँ होंगी जिन्हें ठीक करना आसान होगा)।
सबसे पहले आप एक नया वर्ग बनाएं जिसकी गणना (कार्यान्वयन) की जा सके 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[^]

बिल्कुल भी आसान काम नहीं…

コメント

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