按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
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)。