10

我已经搜索了有关如何使用此功能的文档。虽然我可以编写的循环很简单而且不需要时间,但我真的很想学习如何使用它。

基本上我有一个类,比如说,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 上的任何地方都没有文档。帮助将不胜感激。

4

5 回答 5

16

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

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

或者,更复杂:

widgetList.ForEach(New Action(Of Widged)(Sub(w As Widged) w.Save()))
于 2010-04-07T22:22:33.740 回答
13

如果您使用的是 VB9 (VS2008),我认为您无法轻松使用匿名函数——据我所知,VB9 中的匿名函数必须是真实函数(即它们必须返回一个value)Action<T>而不返回任何东西。C# 2 的匿名方法和 C# 3 的 lambda 表达式更通用,这就是为什么您会看到大量使用List<T>.ForEachC# 的示例而很少使用 VB 的原因:(

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

好消息是VB10有更多的匿名功能支持。(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
于 2009-05-21T09:29:32.440 回答
1
new Action(Of T)(AddressOf Widget.Save) 

如果 Widget 有一个名为Save.

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

于 2011-08-15T08:24:54.823 回答
0

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

new Action(Of T)(AddressOf Widget.Save)
于 2009-05-21T09:29:38.103 回答
-2

尽管我没有跟上 VB.Net 的速度,但下面的内容应该可以工作,因此您可能需要相应地进行调整。

widgetList.ForEach(w => w.Save())
于 2009-05-21T09:18:12.197 回答