在List(Of T)中的Visual Basic中的Action(Of T).ForEach

时间:2009-05-21 09:12:14

标签: vb.net generics foreach

我搜索了有关如何使用此功能的文档的高低。虽然我可以写的循环很简单并且没有时间,但我真的想学习如何使用它。

基本上我有一个班级,比如,Widget,其中Save()子没有返回任何内容。所以:

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

基本上保存小部件。现在假设我有一个通用集合List(Of Widget)名称widgetList(Of Widget),我想对该列表中的每个项目运行Save()。它说我可以做一个

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

....但是如何在F中做这个工作? intrablags上没有任何文档。非常感谢帮助。

5 个答案:

答案 0 :(得分:13)

好吧,我现在真的过时了...... :-)但是在VB中它是:

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

或更复杂:

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

答案 1 :(得分:11)

如果您正在使用VB9(VS2008),我不会认为您可以轻松使用匿名函数 - 据我所知,VB9中的匿名函数 是真正的函数(即它们必须返回一个值),而Action<T>不返回任何内容。 C#2的匿名方法和C#3的lambda表达式更为通用,这就是为什么你会看到大量的例子使用C#中的List<T>.ForEach而很少使用VB:(

您可能会编写一个MakeAction包装器接受一个Function<T,TResult>并返回Action<T>,但我怀疑对VB9匿名函数的其他限制会使这个不切实际的。

好消息是VB10 has much more anonymous function support。 (C#4和VB10正在获得彼此的功能 - 我相信MS从现在开始尝试使用语言平等,比以前更大。)

在此之前,要使用List<T>.ForEach,您需要编写适当的Sub并使用AddressOf从中创建委托。这是一个小例子:

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

答案 2 :(得分:1)

new Action(Of T)(AddressOf Widget.Save) 
如果Widget有一个名为Save的公共函数,那么

就可以了。

当我尝试时,所有其他评论都是错误的。

答案 3 :(得分:0)

假设VB不支持lambda表达式,可以使用以下语法在VB中创建Action(of T)委托的实例:

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

答案 4 :(得分:-1)

下面应该可以工作,虽然我不能在VB.Net上加速,所以你可能需要相应调整。

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