Traductorio "retorno de rendimiento" a VB


Hola a todos, tengo otro problema de traducción que ni siquiera chat.openai.com me pudo ayudar, uso vb 2010, y sé muy bien que a partir de la versión 2012 se soporta “yield”, pero por compatibilidad tengo que usar la versión 2010. ¿Existe alguna alternativa no demasiado descabellada para solucionar el problema? El código es el siguiente:

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

Espero vuestra ayuda y gracias.

Lo que he probado:

Intenté esto, pero no funciona, el programa falla y reinicio vb…

V.B.
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

Solución 2

No diría que “no fue un trabajo simple”, simplemente se hizo de manera diferente a C#. Aquí es cómo: Iterador – Visual Basic | Microsoft aprende[^]

Entonces, supongo (no probado), la versión de VB.Net debería ser:

V.B.
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

Solución 3

Hubo un período en el que yield estaba disponible en C# pero no en vb. Si ese fue el caso en 2010, compruebe si el IEnumerable La interfaz estaba disponible en vb ¿en 2010?

Si el IEnumerable La interfaz estaba disponible en vb en 2010, entonces puedes implementar esa interfaz para una clase que crees para crear un Yield como funcionalidad. Ver Este artículo[^]en realidad no es tan difícil.

Si el IEnumerable La interfaz no estaba disponible en vb en 2010, consulte la respuesta de OriginalGriff o implemente el código a continuación, pero elimine todas las implementaciones de la interfaz. No implementar las interfaces significa que no podrás usar For ... Each pero el While .MoveNext() = True El código aún debería funcionar; a continuación se incluyen ejemplos.

Por ejemplo (no he probado este código, por lo que habrá errores tipográficos que deberían ser fáciles de corregir).
Primero crea una nueva clase que se puede enumerar (implementa IEnumerable). El artículo que vinculé anteriormente describe todo esto en detalle, pero en esencia la nueva clase implementa IEnumerable lo que significa que debe tener la capacidad de crear y devolver un objeto que implemente IEnumerator.

V.B.
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

Luego creamos el enumerador que será utilizado por el objeto enumerable. Puedes ver que la matriz de números enteros se pasa progresivamente desde tu código al IEnumerable objeto y luego el IEnumerator objeto. Debe decidir si deben ser copias superficiales (por referencia) o profundas (por valor) según sus necesidades.

V.B.
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

Luego modifique su código original para usar esta nueva clase. Tenga en cuenta que hay dos formas de hacer la enumeración.

V.B.
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

Entonces es necesario implementar el IEnumerator interfaz para el ThingEnumerator clase.

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

Solución 1

コメント

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