2009-05-21 3 views
7

Ich habe High und Low für Dokumentation zur Verwendung dieser Funktion gesucht. Während die Schleife schreiben könnte, wäre einfach und dauert keine Zeit, ich möchte wirklich lernen, wie man das benutzt.Aktion (Of T) in Visual Basic in Liste (Of T) .ForEach

Grundsätzlich habe ich eine Klasse, sagen wir Widget, mit einer Save() Sub, die nichts zurückgibt. Also:

Dim w as New Widget() 
w.Save() 

im Grunde speichert das Widget. Jetzt sagen wir, ich habe eine generische Sammlung List(Of Widget) Name widgetList(Of Widget) und ich möchte eine Save() für jedes Element in dieser Liste ausführen. Es sagt, ich kann ein

tun .... aber wie in der F funktioniert das ??? Es gibt keine Dokumentation irgendwo in den Intrablags. Hilfe wäre sehr willkommen.

+0

ps Ich habe etwas über Lambda-Funktionen recherchiert und einige dieser Techniken ausprobiert, aber ich konnte keine von ihnen zur Arbeit bringen ... ugh ... – Jason

+0

Wenn Sie Visual Studio 2005 verwenden, haben Sie keinen Zugriff zu Lamda Ausdrücke in VB –

Antwort

11

Wenn Sie mit VB9 (VS2008) Ich glaube nicht Sie eine anonyme Funktion leicht nutzen können - soweit ich weiß, anonyme Funktionen in VB9 haben um echte Funktionen zu sein (dh sie müssen einen Wert zurückgeben), während Action<T> nichts zurückgibt. C# 2 über den anonymen Methoden und C# 3 des Lambda-Ausdrücke allgemeinere sind, weshalb man viele Beispiele sehen werden von C# und nur sehr wenige VB :(

Sie könnten potenziell eine MakeAction Wrapper schreiben, die nimmt .. Function<T,TResult> und gibt eine Action<T>, aber ich vermute, andere Einschränkungen auf VB9 anonymen Funktionen wäre dies nicht praktikabel machen

Die gute Nachricht, dass VB10 has much more anonymous function support (C# 4 und VB10 gewinnen jeweils Funktionen des anderen - ich glaube, MS zu gehen versucht, für Sprachparität von nun an, in einem größeren Ausmaß als zuvor.)

Bis dann, um zu verwenden, müssen Sie eine entsprechende Sub schreiben und AddressOf verwenden, um einen Delegaten daraus zu erstellen. Hier ist ein kleines Beispiel:

Imports System 
Imports System.Collections.Generic 

Public Class Test 

    Shared Sub Main() 
     Dim names as New List(Of String) 
     names.Add("Jon") 
     names.Add("Holly") 
     names.ForEach(AddressOf PrintMe) 

    End Sub 

    Shared Sub PrintMe(ByVal text as String) 
     Console.WriteLine(text) 
    End Sub 

End Class 
+0

danke, und danke für das Beispiel! Ich wünschte, es gäbe einen besseren Weg, als meine bereits wachsende Liste von Klassenfunktionen aufzufüllen, aber das funktioniert jetzt! – Jason

+0

Es ist nicht wirklich so praktisch .. oder? –

-1

Die folgenden sollten funktionieren, obwohl ich nicht auf VB.Net bin nicht so schnell, so müssen Sie möglicherweise entsprechend anpassen.

widgetList.ForEach(w => w.Save()) 
+1

das ist das Problem ... C# und VB unterscheiden sich sehr auf diesem, also brauche ich die VB-Syntax ..... – Jason

0

Unter der Annahme, dass VB nicht Lambda-Ausdrücke nicht unterstützt, können Sie eine Instanz der Aktion (von T) Delegaten in VB mit folgenden Syntax erstellen:

new Action(Of T)(AddressOf Widget.Save) 
12

gut, ich bin jetzt wirklich veraltet ... :-) aber in VB ist es:

widgetList.ForEach(Sub(w) w.Save()) 

oder komplizierter:

widgetList.ForEach(New Action(Of Widged)(Sub(w As Widged) w.Save())) 
+0

Sollte dies nicht die Antwort sein? – Lopsided

1
new Action(Of T)(AddressOf Widget.Save) 

ist in Ordnung, wenn Widget eine öffentliche Funktion namens Save hat.

Alle anderen Kommentare sind falsch, wenn ich es versuche.

Verwandte Themen