[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; }
मुझे आपकी सहायता की आशा है और धन्यवाद।
मैंने क्या प्रयास किया है:
मैंने यह कोशिश की, लेकिन यह काम नहीं करता, प्रोग्राम क्रैश हो जाता है और मैं वीबी को पुनरारंभ करता हूं…
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[^]
बिल्कुल भी आसान काम नहीं…
[ad_2]
コメント