2011-02-03 2 views
1

Я пытаюсь преобразовать следующий код для вычисления дисперсииВычислить дисперсию с лямбда-выражения VB.NET

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); 
} 

, описанной на CodeProject в переписывался синтаксис лямбда-выражения VB.NET, но я застрял в преобразование Совокупность функция.

Как я могу реализовать этот код в VB.NET?

ответ

4

Следующие действия будут работать только в VB 10. Предыдущие версии не поддерживали многострочные лямбды.

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

Function(foo) bar соответствует лямбда (foo) => bar одного заявления в C#, но вам нужно многострочного лямбда здесь, которая существует только с VB 10.

Однако, я настороженно оригинального кода. Изменение total кажется ошибкой, так как перегрузка Aggregate передает свои аргументы по ссылке. Поэтому я предлагаю, что исходный код не так (хотя это может быть скомпилирован), и что правильное решение (в VB) будет выглядеть следующим образом:

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

Кроме того, это не требует каких-либо нескольких -line lambdas, и, следовательно, также работает в более старых версиях VB.

+0

Ну, 'total + = whatever' вернет новое значение' total', поэтому оно будет * работать *, оно просто вводит в заблуждение, потому что оно делает то же самое, что и 'total + whatever' - устанавливает' total' на новое значение в лямбде ничего не делает. –

+0

@BlueRaja: Вот что я имел в виду. –

Смежные вопросы