《VB2008从入门到精通(PDF格式英文版)》第117章


Return (tax * amount) + amount 
End Function 
Notice a return type of Double is declared in the generated code。 The piler did this by
inferring from the code。 
Single…expression lambda expressions have some use; but their real value is in the ability
to create a closure that establishes a context。 A closure holds the evaluated lambda expression
with its bound variables for other functions to use; which is how the context is established。 
Let’s say that we are going to calculate the sales tax for a particular place like Quebec;
Canada。 The sales tax there is 15%; and thus when using the lambda expression; we abstract
and create code similar to the following。 
Console。WriteLine(〃Tax (〃 & calculate(SalesTax。Quebec; 100。0) & 〃)〃) 
The value for the sales tax is held in the property SalesTax。Quebec; and whenever we use
the lambda expression; we need to specify the property。
With lambda expressions and closure; you have the ability to save a context。 For starters;
let’s redefine the lambda expression to have only a single parameter: 
Function(amount As Double) (tax * amount) + amount 
…………………………………………………………Page 266……………………………………………………………
244 CH AP T E R 9 ■ L E A R N IN G AB OU T L I ST S; D E L E G A T E S; A N D L A M B DA E X P R E S SI ON S
Notice that the lambda expression still uses the tax rate in its calculation。 This is where context
es in。 We can save the context of a certain tax rate and then use the lambda expression in that
context。 To do so; we need a lambda expression that returns our new one…parameter lambda
expression: 
Function(tax As Double) Function(amount As Double) (tax * amount) + amount 
We can set the tax rate with the first lambda expression; and then call the second to calcu
late the tax: 
Dim prepareTax = 
Function(tax As Double) Function(amount As Double) (tax * amount) + amount 
Dim doQuebec = prepareTax(0。1) 
Console。WriteLine(doQuebec(100)) 
The call to prepareTax defines doQuebec as prepareTax(0。1) and sets the tax variable in the
context of doQuebec。 Now when we call doQuebec; we can calculate the total amount without
ever needing to specify the tax rate again。 
Lambda expressions allow only a single expression。 If you want to implement a lambda
expression that should make a decision; you have a problem。 To solve this problem; you can
use an If statement variation that is like a function。 Imagine a country where the applicable
sales tax depends on the amount you purchased。 This logic could be implemented using a
closure and ternary If statement; as follows: 
Dim setMinimumSalesTax = Function(minimumSalesTax As Double) 
Function(amount As Double) 
If(amount 》 minimumSalesTax; 
(0。15 * amount) + amount;_ 
(0。1 * amount) + amount) 
Dim calculateTotal = setMinimumSalesTax(100) 
Console。WriteLine(calculateTotal(80)) 
Console。WriteLine(calculateTotal(500)) 
The ternary If is a function that has three parameters。 The first parameter is the expres
sion you want to test。 Typically; whatever you would write in a regular If block; you would
write as the first parameter。 In the example; it is a test of whether or not the bought amount
is greater than a minimum amount。 The second parameter is an expression that is executed
whenever the first parameter results in a True value。 The third parameter executes if the first
parameter results in a False value。 
Another variation of the If function is a two…parameter version that can be used to test
whether or not an object has a value of Nothing; as follows: 
Dim cleanUpList = Function(defaultObject As Object)_ 
Function(objToTest As Object) If(objToTest; defaultObject) 
…………………………………………………………Page 267……………………………………………………………
C HA P TE R 9 ■ L E AR N I N G A B O U T L I ST S; DE L E G AT E S ; AN D L A M B D A E X PR E SSI O N S 245 
The implementation of the lambda expression has an If with two parameters。 The first
parameter is the object to test for Nothing; and the second parameter represents the expression
to execute if the object is Nothing。
Learning More About Collection Types 
In the beginning of this chapter; I talked about the different collection types; but not how to use
them。 This section presents examples of using the types。 
Using a Plain…Vanilla List 
A plain…vanilla list is a list of specific types such as Integer; Double; or some other object type。
Instantiate the list as follows: 
Dim lst As List(Of MyType) = New List(Of MyType)() 
The default type List is used for most of your coding situations; but if you are adding and
removing elements frequently; the following code is better。 
Dim lst As IList(Of MyType) = New LinkedList(Of MyType)() 
The type LinkedList implements the logic that was presented in the previous chapter;
whereas List manipulates a fixed…length array。 LinkedList has a downside in that it does not
support the IList interface; and the sample code will not pile。 Thus; to make the code
work; you would need to use ICollection: 
Dim lst As ICollection(Of MyType) = New LinkedList(Of MyType)() 
Add an element to IList as follows: 
lst。Add(New MyType()) 
To add elements to your list according to an order; use the following form (note that
ICollection doesn’t have this method)。
小说推荐
返回首页返回目录