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)。