Рассчитать дисперсию с помощью лямбда-выражения VB.NET - PullRequest
1 голос
/ 03 февраля 2011

Я пытаюсь преобразовать следующий код для расчета дисперсии

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, но я застрял в преобразовании функции Aggregate .

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

1 Ответ

4 голосов
/ 03 февраля 2011

Следующее будет работать только в 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)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...