vb.net - net - list foreach



Aktion(Of T) in Visual Basic in Liste(Of T).ForEach (4)

Ich habe hoch und niedrig nach Dokumentation gesucht, wie man diese Funktion benutzt. Während die Schleife, die ich schreiben könnte, einfach wäre und keine Zeit braucht, würde ich gerne lernen, wie man das benutzt.

Grundsätzlich habe ich eine Klasse, sagen wir, Widget , mit einem Save() Sub, das nichts zurückgibt. Damit:

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

speichert im Grunde das Widget. widgetList(Of Widget) wir an, 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

widgetList.ForEach([enter Action(Of T) here])

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

https://src-bin.com


Answer #1

Unter der Annahme, dass VB keine Lambda-Ausdrücke unterstützt, können Sie eine Instanz des Action (of T) -Delegaten in VB mit dieser Syntax erstellen:

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

Answer #2

Wenn Sie VB9 (VS2008) verwenden , werden Sie eine anonyme Funktion nicht einfach verwenden können - soweit ich weiß, müssen anonyme Funktionen in VB9 echte Funktionen sein (dh sie müssen eine Wert), während Action<T> nichts zurückgibt. Die anonymen Methoden von C # 2 und die Lambda-Ausdrücke von C # 3 sind allgemeiner, weshalb Sie viele Beispiele mit List<T>.ForEach von C # und sehr wenige, die VB verwenden :(

Sie könnten möglicherweise einen MakeAction Wrapper schreiben, der eine Function<T,TResult> und eine Action<T> zurückgibt, aber ich vermute, dass andere Einschränkungen für anonyme Funktionen von VB9 dies unpraktisch machen würden.

Die gute Nachricht ist, dass VB10 viel anonymere Funktionen unterstützt . (C # 4 und VB10 gewinnen gegenseitig an Bedeutung. Ich glaube, dass MS von nun an mehr auf Sprachparität setzt als zuvor.)

Bis dahin müssen Sie, um List<T>.ForEach zu verwenden, ein entsprechendes Sub schreiben und AddressOf , um daraus einen Delegaten 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

Answer #3

Das Folgende sollte funktionieren, obwohl ich nicht auf VB.Net auf dem neuesten Stand bin, so dass Sie möglicherweise entsprechend anpassen müssen.

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

Answer #4
new Action(Of T)(AddressOf Widget.Save) 

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

Alle anderen Kommentare sind falsch, wenn ich es versuche.





foreach