我开发了以下IEnumerable(of T)扩展方法来执行加权平均计算。
出于某种原因,下面编写的代码可以正常工作,但如果我取消注释显示'Return If(isNull OrElse den = 0, Nothing, num / den)
的行,它将返回值0,而不应该返回任何内容。这可以通过在没有项目的列表上调用该函数来确认。调用该函数的正确方法是:
list.WeightedAverage(Function(x) x.ValueProperty, Function(x) x.WeightProperty)
。因为它是一种扩展方法,所以需要将它放入模块中。
<Extension>
Public Function WeightedAverage(Of T)(source As IEnumerable(Of T), valueSelector As Func(Of T, Decimal?), weightSelector As Func(Of T, Decimal?)) As Decimal?
Dim num, den, tempDen As Decimal
Dim tempNum As Decimal? = Nothing
Dim isNull As Boolean = True
For Each record In source
tempNum = valueSelector.Invoke(record)
tempDen = weightSelector.Invoke(record).GetValueOrDefault
If tempNum.HasValue Then
isNull = False
num += tempNum * tempDen
End If
den += tempDen
Next
'Return If(isNull OrElse den = 0, Nothing, num / den)
If isNull OrElse den = 0 Then
Return Nothing
Else
Return num / den
End If
End Function
我的问题是为什么在一行上使用If
语句不起作用?