2011-02-03 100 views
1

我想下面的代碼轉換爲方差計算上CodeProject描述成對應VB.NET lambda表達式語法計算方差與VB.NET lambda表達式

public static double Variance(this IEnumerable<double> source) 
{ 
    double avg = source.Average(); 
    double d = source.Aggregate(0.0, 
       (total, next) => total += Math.Pow(next - avg, 2)); 
    return d/(source.Count() - 1); 
} 

,但我被困在轉換彙總功能。

如何在VB.NET中實現該代碼?

回答

4

以下僅適用於VB 10.以前的版本不支持多行lambda表達式。

Dim d = source.Aggregate(0.0, 
    Function(total, next) 
     total += (next - avg)^2 
     Return total 
    End Function) 

Function(foo) bar對應於C#中的單語句拉姆達(foo) => bar,但你需要在這裏多行拉姆達只因爲VB 10

不過,我警惕的原代碼的存在。修改total看起來像是一個錯誤,因爲沒有Aggregate重載通過引用傳遞它的參數。所以,我建議,原來的代碼是錯誤的(即使它實際上可能編譯),而正確的解決方案(以VB)是這樣的:

Dim d = source.Aggregate(0.0, _ 
    Function(total, next) total + (next - avg)^2) 

而且,這並不需要任何多線lambda表達式,因此也適用於舊版本的VB。

+0

那麼`total + = whatever`會返回`total`的新值,所以它會工作*,這只是誤導,因爲它和`total + whatever`完全相同 - 設置`total`爲lambda中的新值不做任何事情。 – 2011-02-03 16:12:35