¿Puedo poner en práctica el retorno de rendimiento para las funciones de IEnumerable en VB.NET? [duplicar]

StackOverflow https://stackoverflow.com/questions/875587

Pregunta

  

Duplicar posible:
   En VB.NET

En C #, al escribir una función que devuelve un IEnumerble<>, puede utilizar yield return para devolver un solo elemento de la enumeración y yield break; para significar hay elementos restantes. ¿Cuál es la sintaxis VB.NET para hacer la misma cosa?

Un ejemplo de la NerdDinner código:

public IEnumerable<RuleViolation> GetRuleViolations() {

   if (String.IsNullOrEmpty(Title))
       yield return new RuleViolation("Title required","Title");

   if (String.IsNullOrEmpty(Description))
       yield return new RuleViolation("Description required","Description");

   if (String.IsNullOrEmpty(HostedBy))
       yield return new RuleViolation("HostedBy required", "HostedBy");

   if (String.IsNullOrEmpty(Address))
       yield return new RuleViolation("Address required", "Address");

   if (String.IsNullOrEmpty(Country))
       yield return new RuleViolation("Country required", "Country");

   if (String.IsNullOrEmpty(ContactPhone))
       yield return new RuleViolation("Phone# required", "ContactPhone");

   if (!PhoneValidator.IsValidNumber(ContactPhone, Country))
       yield return new RuleViolation("Phone# does not match country", "ContactPhone");

   yield break;
}

convertir C # a VB.NET herramienta da una "YieldStatement no es compatible" error.

¿Fue útil?

Solución

En la actualidad existe ningún equivalente a un rendimiento de retorno C # 's en VB.Net desde un nivel de sintaxis del lenguaje.

Sin embargo, había una reciente escribir en la revista de MSDN por Bill McCarthy sobre cómo implementar un patrón similar en VB.Net 9,0

Otros consejos

El nuevo rel="noreferrer"> incluye soporte para Yield en VB.NET .

iteradores en de Visual Basic para obtener información sobre su uso.

Vea mis respuestas aquí:

Para resumir:
VB.Net no tiene el rendimiento, pero C # implementa el rendimiento mediante la conversión de su código para una máquina de estado detrás de esa escena. Static palabra clave de VB.Net también le permite almacenar el estado dentro de una función, por lo que, en teoría, debería ser capaz de implementar una clase que le permite escribir código similar cuando se utiliza como un miembro Static de un método.

No retorno rendimiento en VB.NET :( Basta con crear una lista y lo devuelve.

Entre bastidores, el compilador crea una clase de enumerador para hacer el trabajo. Desde VB.NET no implementa este patrón, usted tiene que crear su propia implementación de IEnumerator (Of T)

A continuación da salida: 2, 4, 8, 16, 32

En VB,

Public Shared Function setofNumbers() As Integer()

    Dim counter As Integer = 0
    Dim results As New List(Of Integer)
    Dim result As Integer = 1
    While counter < 5
        result = result * 2
        results.Add(result)
        counter += 1
    End While
    Return results.ToArray()
End Function

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    For Each i As Integer In setofNumbers()
        MessageBox.Show(i)
    Next
End Sub

En C #

   private void Form1_Load(object sender, EventArgs e)
    {
        foreach (int i in setofNumbers())
        {
            MessageBox.Show(i.ToString());
        }
    }

    public static IEnumerable<int> setofNumbers()
    {
        int counter=0;
        //List<int> results = new List<int>();
        int result=1;
        while (counter < 5)
        {
          result = result * 2;
          counter += 1;
          yield return result;
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top