vb.net - salir - Acción(de T) en Visual Basic en la lista(de T).ParaEach
foreach list vb net (5)
He buscado alto y bajo para documentación sobre cómo usar esta característica. Si bien el ciclo que podía escribir sería simple y no tardaría mucho tiempo, me gustaría aprender a usarlo.
Básicamente tengo una clase, por ejemplo, Widget
, con un sub Save()
que no devuelve nada. Asi que:
Dim w as New Widget()
w.Save()
Básicamente guarda el widget. Ahora digamos que tengo una List(Of Widget)
genérica de la colección List(Of Widget)
widgetList(Of Widget)
y quiero ejecutar un Save()
en cada elemento de esa lista. Dice que puedo hacer una
widgetList.ForEach([enter Action(Of T) here])
.... pero ¿cómo en la F funciona esto? No hay documentación en ninguna parte de los intrablags. La ayuda sería muy apreciada.
Si está usando VB9 (VS2008), no creo que pueda usar una función anónima fácilmente, hasta donde yo sé, las funciones anónimas en VB9 tienen que ser funciones reales (es decir, tienen que devolver un valor) mientras que Action<T>
no devuelve nada. Los métodos anónimos de C # 2 y las expresiones lambda de C # 3 son más generales, por lo que verás List<T>.ForEach
ejemplos usando List<T>.ForEach
desde C # y muy pocos usando VB :(
Podría escribir potencialmente un contenedor MakeAction
que tome una Function<T,TResult>
y devuelva una Action<T>
, pero sospecho que otras restricciones en las funciones anónimas de VB9 lo harían impráctico.
La buena noticia es que VB10 tiene mucho más soporte de función anónima . (C # 4 y VB10 están ganando sus respectivas características: creo que MS está tratando de alcanzar la paridad de idiomas a partir de ahora, en mayor medida que antes).
Hasta entonces, para usar List<T>.ForEach
, tendrá que escribir un Sub
correspondiente y usar AddressOf
para crear un delegado. Aquí hay un pequeño ejemplo:
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
Suponiendo que VB no admite expresiones lambda, puede crear una instancia del delegado de Acción (de T) en VB usando esta sintaxis:
new Action(Of T)(AddressOf Widget.Save)
bueno, ahora estoy desactualizado ... :-) pero en VB es:
widgetList.ForEach(Sub(w) w.Save())
o, más complicado:
widgetList.ForEach(New Action(Of Widged)(Sub(w As Widged) w.Save()))
Lo que sigue a continuación debería funcionar, aunque no estoy actualizado en VB.Net, por lo que es posible que deba ajustarlo en consecuencia.
widgetList.ForEach(w => w.Save())
new Action(Of T)(AddressOf Widget.Save)
está bien si Widget obtuvo una función pública llamada Save
.
Todos los demás comentarios son falsos cuando lo intento.