Puis-je mettre en œuvre le retour de rendement pour les fonctions IEnumerable en VB.NET? [dupliquer]

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

Question

  

Possible en double:    Rendement en VB.NET

En C #, lors de l'écriture d'une fonction qui renvoie un IEnumerble<>, vous pouvez utiliser yield return pour renvoyer un seul élément de l'énumération et yield break; pour signifier aucun élément restant. Quelle est la syntaxe VB.NET pour faire la même chose?

Un exemple de la NerdDinner code:

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 # VB.NET à l'outil donne erreur "YieldStatement est non pris en charge".

Était-ce utile?

La solution

Il n'y a actuellement pas d'équivalent au rendement de rendement de C # en VB.Net à partir d'un niveau de syntaxe du langage.

Cependant il y avait un récent rédiger dans le magazine MSDN par Bill McCarthy sur la façon de mettre en œuvre un schéma similaire dans VB.Net 9.0

Autres conseils

Le nouveau Async CTP inclut le support pour Yield en VB.NET .

Voir itérateurs Visual Basic pour obtenir des informations sur l'utilisation.

Voir mes réponses ici:

Pour résumer:
VB.Net n'a pas le rendement, mais C # met en œuvre le rendement en convertissant votre code à une machine d'état derrière les scènes. Le mot-clé Static de VB.Net vous permet également de stocker l'état dans une fonction, donc en théorie vous devriez être en mesure de mettre en œuvre une classe qui vous permet d'écrire un code similaire lorsqu'il est utilisé en tant que membre Static d'une méthode.

Aucun retour de rendement en VB.NET :( Il suffit de créer une liste et le retourner.

Dans les coulisses, le compilateur crée une classe de recenseur pour faire le travail. Étant donné que VB.NET ne met pas en œuvre ce modèle, vous devez créer votre propre implémentation de IEnumerator (Of T)

ci-dessous donne la sortie: 2, 4, 8, 16, 32

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;
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top