2009-05-17 8 views
9

Eventuali duplicati:
Yield In VB.NETÈ possibile implementare il rendimento restituito per le funzioni IEnumerable in VB.NET?

In C#, quando si scrive una funzione che restituisce un IEnumerble<>, è possibile utilizzare yield return per restituire un singolo elemento dell'enumerazione e yield break; a significare nessun residuo elementi. Qual è la sintassi VB.NET per fare la stessa cosa?

Un esempio dal codice NerdDinner:

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

Questo convert C# to VB.NET tool dà un "YieldStatement non è supportato" errore.

+0

Si noti che il rendimento non sta ritornando, almeno non nel senso che la maggior parte delle persone intende tornare (il modo in cui è implementato sotto il cofano nonostante). Inoltre, non hai bisogno di interruzioni di rendimento lì.Inoltre, si potrebbe voler pensare a trasformare quel codice da una enumerazione di oggetti RuleViolation a una enumerazione di Func delegati. – yfeldblum

+0

L'utilizzo di yield mi ricorda le piping in cui il codice chiamante può iniziare a scorrere l'ienumerable * prima che * la funzione che restituisce l'ienumerable abbia finito di funzionare. Molto bello! –

+2

Questo è un esempio terribile, perché non hai bisogno di voi per qualcosa del genere: qual è il vantaggio di determinare le violazioni delle regole pigramente? Riempi tutti in una lista e finisci. Questo non vuol dire che yeild non è utile, ma questo è solo un cattivo esempio – piers7

risposta

0

Nessun ritorno resa in VB.NET :( Basta creare un elenco e lo restituisce.

2

Vedere le mie risposte qui:

In sintesi:
VB.Net non ha resa, ma C# implementa resa convertendo il codice per una macchina a stati dietro a quelle scene. La parola chiave Static di VB.Net consente anche di memorizzare lo stato all'interno di una funzione, quindi in teoria dovresti essere in grado di implementare una classe che ti permetta di scrivere codice simile quando usato come membro di un metodo come Static.

0

Dietro le quinte, il compilatore crea una classe di enumeratore per eseguire il lavoro. Dal momento che VB.NET non implementa questo modello, è necessario creare una propria implementazione di IEnumerator (Of T)

0

seguente fornisce in uscita: 2, 4, 8, 16, 32

In 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 

in 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; 
     } 
    } 
+2

Sì, per questo semplice esempio, funzionerebbe. Esistono altri esempi migliori di iteratori in cui non si desidera o non è possibile creare l'intera lista all'interno di una singola chiamata di funzione. Il tuo codice C# calcola solo ogni valore mentre li usi all'interno del ciclo 'foreach'. Il codice VB calcola tutti i valori quando si chiama la funzione 'setOfNumbers'. Questa è una differenza significativa. – CoderDennis

Problemi correlati