maxValue = value End If Next Console。WriteLine(〃Maximum value is (〃 & maxValue & 〃)〃) Another variation is as follows: Dim elements As IList(Of Integer) = New List(Of Integer)() elements。Add(1) elements。Add(2) elements。Add(3) Dim runningTotal As Integer = 0 Dim maxValue As Integer = Integer。MinValue For Each value As Integer In elements If value 》 maxValue Then maxValue = value End If runningTotal = runningTotal + value Next …………………………………………………………Page 259…………………………………………………………… 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 237 For one or two instances; writing the For Each loop is not that problematic; but it would be if you needed to use the iterator code in a dozen places。 This type of code is harder to maintain and extend。 One way of being more efficient is to delegate the code to an abstract base class that is implemented to calculate the running total or maximum value。 The following is the plete code (you can place the three classes in separate files called IteratorBaseClass。vb; RunningTotal。vb; and MaximumValue。vb if you want to test this)。 MustInherit Class IteratorBaseClass Protected Sub New(ByVal collection As IList(Of Integer)) _collection = collection End Sub Public Function Iterate() As IteratorBaseClass Dim element As Integer For Each element In Me。_collection ProcessElement(element) Next Return Me End Function Protected MustOverride Sub ProcessElement(ByVal value As Integer) Private _collection As IList(Of Integer) End Class Class RunningTotal Inherits IteratorBaseClass Public Sub New(ByVal collection As IList(Of Integer)) MyBase。New(collection) Total = 0 End Sub Protected Overrides Sub ProcessElement(ByVal value As Integer) Total = Total + value End Sub Public Total As Integer End Class Class MaximumValue Inherits IteratorBaseClass Public Sub New(ByVal collection As IList(Of Integer)) MyBase。New(collection) MaxValue = Integer。MinValue End Sub …………………………………………………………Page 260…………………………………………………………… 238 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 Protected Overrides Sub ProcessElement(ByVal value As Integer) If (value 》 MaxValue) Then MaxValue = value End If End Sub Public MaxValue As Integer End Class Module Module1 Sub Main() Dim elements As IList(Of Integer) = New List(Of Integer)() elements。Add(1) elements。Add(2) elements。Add(3) Dim runningTotal As Integer = _ TryCast(New RunningTotal(elements)。Iterate(); RunningTotal)。Total Dim maximumValue As Integer = _ TryCast(New MaximumValue(elements)。Iterate(); MaximumValue)。MaxValue Console。WriteLine(〃RunningTotal (〃 & runningTotal & 〃)〃) Console。WriteLine(〃Maximum Value (〃 & maximumValue & 〃)〃) End Sub End Module The rewritten code is much longer; even though the bolded code; which represents the user code; is much shorter。 However; this code still isn’t right。 The code is ill fitting because the problem that it addresses can be solved using another; simpler technique。 So; in a nutshell; you can say the problem is that you want to solve a single particular technical problem using an elegant piece of code that does not include repeated sections that have been copied and pasted。 A better solution is consider the code as two code blocks; and in the following section; you’ll see how delegates can solve the problem of adding and keeping a running total。 WEIGHING THE ADVANTAGES OF REUSING CODE Very often; when you write code; the code that performs the task directly is shorter and to the point。 When you abstract the code and develop general classes; the code will begin to bloat and expand; but the advantage is that the code can be reused。 So; when is abstracting code worth the effort? Consider the analogy of building a house。 You are constructing the trusses for the house。 You have a blueprint that indicates that you need to build 50 trusses。 You could build each of the 50 trusses individually; or you could build a jig to speed up building the trusses。 And herein lies the problem。 If the trusses can be built without a jig in 10 hours; and with the jig in 2 hours; you would think building the jig was a good idea。 But not so fast。 What if building the jig takes 20 hours? Then the time that you saved by using the jig you lost by building the jig。 …………………………………………………………Page 261…………………………………………………………… 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 239 Software is no different。 Sometimes; even though the code