【问题标题】:Action(Of T) in Visual Basic in List(Of T).ForEachList(Of T).ForEach 中 Visual Basic 中的 Action(Of T)
【发布时间】:2009-05-21 09:12:13
【问题描述】:

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

基本上我有一个类,比如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 上的任何地方都没有文档。非常感谢您的帮助。

【问题讨论】:

  • ps 我对 lambda 函数进行了一些研究并尝试了其中一些技术,但我无法让它们中的任何一个工作......呃......
  • 如果您使用的是 Visual Studio 2005,您将无法在 VB 中访问 Lamda 表达式

标签: vb.net generics foreach


【解决方案1】:

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

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

或者,更复杂的:

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

【讨论】:

  • 这不应该是答案吗?
【解决方案2】:

如果您使用的是 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

【讨论】:

  • 谢谢你,谢谢你的例子!我希望有更好的方法,而不是把我已经增长的类函数列表弄得乱七八糟,但现在这行得通!
  • 这不是真的那么实用..是吗?
【解决方案3】:
new Action(Of T)(AddressOf Widget.Save) 

如果 Widget 有一个名为 Save 的公共函数就可以了。

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      虽然我在 VB.Net 上的速度不够快,但以下应该可以工作,因此您可能需要相应地进行调整。

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

      【讨论】:

      • 这就是问题所在... C# 和 VB 在这方面差别很大,所以我需要 VB 语法.....
      猜你喜欢
      • 2010-09-28
      • 1970-01-01
      • 2010-09-19
      • 2011-04-13
      • 2021-05-25
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      相关资源
      最近更新 更多