2009-05-21 25 views
7

He buscado alto y bajo para documentación sobre cómo utilizar esta característica. Si bien el ciclo I podría escribir sería simple y no tardaría mucho tiempo. Realmente me gustaría aprender a usarlo.Acción (De T) en Visual Basic en la lista (Of T) .ForEach

Básicamente tengo una clase, por ejemplo, Widget, con un sub Save() que no devuelve nada. Entonces:

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

básicamente guarda el widget. Ahora digamos que tengo una colección genérica List(Of Widget) nombre widgetList(Of Widget) y quiero ejecutar un Save() en cada elemento de esa lista. Dice que puedo hacer un

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

.... pero ¿cómo funciona esto? No hay documentación en ninguna parte de los intrablags. La ayuda sería muy apreciada.

+0

ps hice algunas investigaciones sobre las funciones de lambda e intenté algunas de esas técnicas, pero no pude conseguir que ninguna de ellas funcionara ... ugh ... – Jason

+0

Si está usando Visual Studio 2005 no tendrá acceso a las expresiones de Lamda en VB –

Respuesta

11

Si está utilizando VB9 (VS2008) No creo podrás utilizar una función anónima fácilmente - por lo que yo soy, en funciones anónimas conscientes VB9 tienen para ser funciones reales (es decir, tienen que devolver un valor) mientras que Action<T> no devuelve nada. C# los métodos anónimos de 2 y C# de 3 expresiones lambda son más generales, por lo que verá un montón de ejemplos que usan desde C# y muy pocos usando VB :(

usted podría escribir un envoltorio MakeAction cuales toma una .. Function<T,TResult> y devuelve un Action<T>, pero sospecho otras restricciones sobre las funciones anónimas VB9 haría que este práctico

La buena noticia es que VB10 has much more anonymous function support (C# 4 y VB10 están ganando características de cada uno - creo MS está tratando de ir para la paridad de idiomas a partir de ahora, en mayor medida que antes.)

Hasta entonces, para usar , deberá escribir un Sub apropiado y usar AddressOf para crear un delegado. He aquí 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 
+0

¡gracias y gracias por el ejemplo! Desearía que hubiera una manera mejor que saturar mi ya creciente lista de funciones de clase, ¡pero esto funciona por ahora! – Jason

+0

No es tan práctico ... ¿o sí? –

-1

Lo que sigue debe funcionar, aunque no estoy actualizado en VB.Net, por lo que es posible que deba ajustarlo en consecuencia.

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

ese es el problema ... C# y VB difieren mucho en esto, así que necesito la sintaxis de VB ..... – Jason

0

Suponiendo que VB no admite expresiones lambda, se puede crear una instancia de la acción (de T) delegado en VB con esta sintaxis:

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

bueno, 'm muy anticuado ahora ... :-) 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())) 
+0

¿No debería ser esta la respuesta? – Lopsided

1
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.

Cuestiones relacionadas