В задаче было сказано, что надо упорядочить элементы именно самого массива, а не просто получить результат на выводе. Ну и половин-то две… А в целом идея с очередью мне очень понравилась!
Попробую поэкспериментировать. Может, удастся написать код короче, чем у меня получился.
Метод Average с функцией преобразования n -> n * n выдаёт ошибку. А последовательное применение методов Select(n -> n * n).Average() работает нормально:
` // Average
var sq := Range(1, 10).Println;
Println(sq.Average(n -> n * n));
Println(sq.Select(n -> n * n).Average());’
Да. Но single или double?
Я пробовал в Sum писать выражения - там вообще был дурдом. Ответы в одних случаях были верными, в других - нет. А источником служил рандомный массив, не последовательность, т.е. данные не перевычислялись.
Я бы привел, конечно, как приводил уже многие другие примеры, когда ошибка была стабильной. Но в этом случае был цейтнот, я перенес условие в фильтр Where и все получилось. А что я там писал конкретно, я от злости и досады, вместе взятых, тут же и забыл. попробую восстановить, если получится - обязательно напишу. Помню только, что там работа была с массивом типа real.
Такую же ошибку компиляции в Avarage выдает даже более простой вариант
// PascalABC.NET 3.2, сборка 1363 от 17.12.2016
// Внимание! Если программа не работает, обновите версию!
begin
var sq := Seq(1,2,3);
Println(sq.Sum(n->n));
Println(sq.Average(n->n));
end.
```
При этом с Sum все нормально.
По моему скромному разумению, результат должен иметь тип double.
Это более логично, чем float.
Хотя перегрузки определяются типами параметров, а не результата.
Это - слабый алгоритм вывода типов в нашем компиляторе и 20 перегрузок метода Average с близкими типами. Это нельзя назвать багом, но - очень неприятная фича.
По сути, игры с лямбдой в Average легко обходятся использованием Select(…).Average; Посему, особой печали это не должно вызывать. Надо знать об этой фиче - и не более того. “Предупреждён - значит, вооружен!” (с)