Jas*_*son 8 vb.net generics foreach
我搜索了有关如何使用此功能的文档的高低.虽然我可以编写的循环很简单并且不花时间,但我真的想学习如何使用它.
基本上我有一个类,比方说Widget,有一个Save()没有返回的子.所以:
Dim w as New Widget()
w.Save()
Run Code Online (Sandbox Code Playgroud)
基本上保存小部件.现在假设我有一个通用的集合List(Of Widget)名称widgetList(Of Widget),我想Save()在该列表中的每个项目上运行一个.它说我可以做
widgetList.ForEach([enter Action(Of T) here])
Run Code Online (Sandbox Code Playgroud)
....但是如何在F中做这个工作?intrablags上没有任何文档.非常感谢帮助.
小智 14
好吧,我现在真的过时了...... :-)但是在VB中它是:
widgetList.ForEach(Sub(w) w.Save())
Run Code Online (Sandbox Code Playgroud)
或者,更复杂:
widgetList.ForEach(New Action(Of Widged)(Sub(w As Widged) w.Save()))
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 11
如果你正在使用VB9(VS2008),我认为你不能轻易使用匿名函数 - 据我所知,VB9中的匿名函数必须是真正的函数(即它们必须返回一个价值)Action<T>而不返回任何东西.C#2的匿名方法和C#3的lambda表达式更为通用,这就是为什么你会看到大量使用List<T>.ForEachC#的例子,很少使用VB :(
你可能会写一个MakeAction包装它需要一个Function<T,TResult>和返回Action<T>,但我怀疑在VB9匿名函数其他限制将使这是不切实际的.
好消息是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
Run Code Online (Sandbox Code Playgroud)