Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Working around no lambdas in VS 2005

I have the following excerpt from some wonderful legacy code:

Private Sub SomeMethod()
    Dim deductibles As List(Of Integer) = GetDeductibles()    
    deductibles.RemoveAll(AddressOf LessThanMinDed)
EndSub
Private Function LessThanMinDed(ByVal i As Integer) As Boolean
    Return i < MinimumDeductible()
End Function

If you're a language snob, we can write it this way:

private void SomeMethod() {
    List<int> deductibles = GetDeductibles();    
    deductibles.RemoveAll(LessThanMinDed);
}
private bool LessThanMinDed(int i) {
    return i < MinimumDeductible();
}

MinimumDeductible() makes a database call. Is there a way to write this without writing something like x = MinimumDeductible() : RemoveAll(Function(i) i < x) (since lambdas aren't in this version of VB.NET) that will make a call to the database just once?

Solved (kind of):

Work around like so:

Public Class Foo
    Private CachedMinimum As Integer
    Private Sub SomeMethod()
        Dim deductibles As List(Of Integer) = GetDeductibles()
        Me.CachedMinimum = MinimumDeductible()
        deductibles.RemoveAll(AddressOf LessThanMinDed)
    End Sub
    Private Function LessThanMinDed(ByVal i As Integer) As Boolean
        Return i < CachedMinimum
    End Function
End Class
like image 857
Joseph Nields Avatar asked Dec 19 '22 04:12

Joseph Nields


1 Answers

The answer really depends on the language. In C# 2, we didn't have lambda expressions but we did have anonymous methods... so you can write:

List<int> deductibles = GetDeductibles();    
deductibles.RemoveAll(delegate(int i) { return i < MinimumDeductible(); });

As far as I'm aware, there's no equivalent in the version of VB that shipped with VS 2005.

like image 159
Jon Skeet Avatar answered Dec 21 '22 17:12

Jon Skeet