2012-11-17 13 views
1

请看看下面的代码。VB.NET - 包含子/函数的方法参数

Dim results As IEnumerable(Of Customer) = ExecuteDataReader(_ 
       "SELECT * FROM Customer WHERE Sales> @MinSales", _ 
      Sub(p) p.Add("@MinSales", SqlDbType.Double).Value = 10000.0, _ 
      Function(r) New Customer() With {Name=r("Name"), Address=r("Address"), Sales=r("Sales") }) 

For Each c As Customer in results 
    '... 
Next 

在我发布的上一个问题中,答复者发布了此代码。我不明白sub(p)function(r)部分代码。

不幸的是,我没有任何基础来寻找这个答案。因此,我在完成有限的研究后发布了这个问题。

什么是sub(p)function(r)意味着什么?

更新14:54

请参见下文。什么意思是:(Of T)ByVal castRow As Function(Of IDataRecord, T)

Public Iterator Function ExecuteDataReader(Of T)(ByVal sql As String, 
ByVal addParams as Action(Of SqlParameterCollection), ByVal castRow As 
Funnction(Of IDataRecord, T)) As IEnumerable(Of T) 
+0

@Tim Schmelter,谢谢。我很想去,但回答者回答了我原来的问题。这是一个完全不同的问题。我从其他答案(通常不是我的问题)中看到回答者提出一个新问题的意见。 – w0051977

+0

@ Damien_The_Unbeliever,谢谢。你能发表一个答案,以便我可以给一些信用? – w0051977

回答

1

Lambda Expressions

lambda表达式是不能够被用于任何一个代表是有效的名称的函数或子程序。 Lambda表达式可以是函数或子例程,可以是单行或多行。您可以将当前范围的值传递给lambda表达式。

Dim increment1 = Function(x) x + 1 
Dim increment2 = Function(x) 
        Return x + 2 
       End Function 
+0

谢谢。为什么你不必指定参数的类型?在你的例子中,x可以是Integer,String,SQLConnection,Person对象等。 – w0051977

+0

@ w0051977 - 编译器非常聪明 - 通常它可以推断出参数的类型,因此你不必提供它们。在我已链接的页面上放下“您可以使用As关键字指定lambda表达式参数的数据类型,或者可以推断参数的数据类型。所有参数必须具有指定的数据类型或全部必须被推断“。 –

+0

我已经更新了这个问题。你能看看第二部分吗?谢谢 – w0051977