Kann ich yield return für IEnumerable Funktionen in VB.NET implementieren? [Duplikat]
-
22-08-2019 - |
Frage
Mögliche Duplizieren:
Yield In VB.NET
In C #, wenn eine Funktion zu schreiben, die eine IEnumerble<>
zurückgibt, können Sie yield return
verwenden, um ein einzelnes Element der Aufzählung und yield break;
zurückzukehren keine verbleibenden Elemente bedeuten. Was ist die VB.NET-Syntax, die gleiche Sache zu tun?
Ein Beispiel aus der 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;
}
Das C # VB.NET-Tool zu konvertieren a gibt "YieldStatement wird nicht unterstützt" Fehler.
Lösung
Es gibt derzeit keine Entsprechung zu C # 's Ertrag Rückkehr in VB.Net aus einer Sprachsyntax Ebene.
Allerdings gab es eine kürzlich in MSDN Magazin von Bill McCarthy schreibt auf, wie ein ähnliches Muster in VB.Net 9.0
implementierenAndere Tipps
Der neue Async CTP Unterstützung für Yield
enthält in VB.NET .
Siehe Iteratoren in Visual Basic Informationen zur Verwendung.
Sehen Sie meine Antworten hier:
Um es zusammenzufassen:
VB.Net nicht über Ausbeute, aber C # implementiert Ausbeute von Ihrem Code zu einer Zustandsmaschine Umwandlung hinter diesen Szenen. VB.Net des Static
Schlüsselwort ermöglicht es Ihnen auch zu speichern Zustand innerhalb einer Funktion, so in der Theorie sollte es möglich sein, eine Klasse zu implementieren, die Sie ähnlichen Code schreiben können, wenn sie als Static
Mitglied einer Methode verwendet wird.
Keine yield return in VB.NET :( Erstellen Sie einfach eine Liste und gibt es zurück.
Hinter den Kulissen, erzeugt der Compiler eine Enumerator-Klasse die Arbeit zu tun. Da VB.NET dieses Muster nicht implementiert, müssen Sie Ihre eigene Implementierung von IEnumerator erstellen (Of T)
Im Folgenden gibt Ausgang: 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;
}
}