[ad_1]
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:
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…
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:
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
.
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.
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.
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.
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
Mira aquí: https://stackoverflow.com/questions/2912851/what-is-the-equivalent-syntax-in-vb-net-for-yield-return[^]
No es un trabajo nada sencillo…
[ad_2]
コメント