我从一些精彩的遗留代码中摘录了以下内容:
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
如果你是一个语言势利小人,我们可以这样写:
private void SomeMethod() {
List<int> deductibles = GetDeductibles();
deductibles.RemoveAll(LessThanMinDed);
}
private bool LessThanMinDed(int i) {
return i < MinimumDeductible();
}
MinimumDeductible()
进行数据库调用。有没有办法写这个而不用写一些像x = MinimumDeductible() : RemoveAll(Function(i) i < x)
(因为lambdas不在这个版本的VB.NET中)只能调用一次数据库?
像这样解决:
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
答案 0 :(得分:7)
答案实际上取决于语言。在C#2中,我们没有lambda表达式,但我们做了有匿名方法......所以你可以写:
List<int> deductibles = GetDeductibles();
deductibles.RemoveAll(delegate(int i) { return i < MinimumDeductible(); });
据我所知,在VS 2005附带的VB版本中没有相应的版本。
答案 1 :(得分:3)
在一天结束时,Lambdas只是语法上的冒犯。它们总是被转换为命名函数,所以是的,它肯定是可能的(你总是可以使用以下模式的修改来删除任何lambda)。只需使用您需要的方法创建一个新对象,并为要关闭的值创建字段:
public class MyComparer
{
private int value;
public MyComparer(int value)
{
this.value = value;
}
public bool LessThanMinDed(int i)
{
return i < value;
}
}
您现在可以写:
var comparer = new MyComparer(MinimumDeductible())
deductibles.RemoveAll(comparer.LessThanMinDed);
答案 2 :(得分:1)
你的意思是&#34; VS 2005&#34; (大概你的意思是C#2.0)?语法不同!
int min = MinimumDeductible();
deductibles.RemoveAll(delegate (int i) {
return i < min;
});
答案 3 :(得分:0)
1)我会尝试在DB上解决它。正如你所说的MinimumDeductible来自一个数据库,我猜GetDeductibles(..)也可能来自同一个数据库然后我只是创建一个SQL-View,如
SELECT * FROM Deductibles ApplicationSettings
WHERE Deductibles.Amount >= ApplicationSettings.MinimumDeductible;
在应用程序中选择已过滤的视图。
2)如果不可能,我不会使用任何删除操作来解决问题。如果您在列表中使用删除,则必须首先找到该项目,这意味着如果您有10&000; 000项目,则必须比较平均5000行,直到找到该项目为止(因为列表不支持哈希码)。最好在单个循环中复制项目,然后将结果重新分配给上一个变量,如下所示:
Private Sub SomeMethod()
Dim deductibles As List(Of Integer) = GetDeductibles()
Dim minimum As Int32 = MinimumDeductible()
deductibles = GetFilteredDeductibles(deductibles, minimum)
End Sub
Private Shared Function GetFilteredDeductibles(rawDeductibles As List(Of Int32), minimumValue As Int32) As List(Of Int32)
Dim result As New List(Of Int32)(rawDeductibles.Count)
For Each myValue As Int32 In rawDeductibles
If (myValue >= minimumValue) Then
result.Add(myValue)
End If
Next
result.TrimExcess()
Return result
End Function