Значит, все же читают!
Summary
Если Вы - Валерий Рубанцев, особенность ваших книг в том, что в каждой серии рассмотрены аналогичные задания на различных языках, с учётом специфики. У нас в школе была ксерокопия книги или методички, где задачи были параллельно на Бейсике, Паскале, Си, и вроде бы Фортране, а уместное сравнение всегда полезно и познавательно.
Александр, Вы правы: в идеале нужно чётко представлять и продумать весь проект используя верный подход и только чистые (“идеальные”) функции и процедуры, которые оперируют лишь параметрами, не учитывая и не изменяя внешние значения и данные.
Summary
Но это только в идеале, а на практике приходится быстро решать подзадачи по диспетчеризации отдельный узкопрофильных приложений на разных языках, ОС и компьютерах.
Я считаю, что фирменная особенность Паскаля в том, что всегда есть “Содержание” - перечень всех констант и переменных, без рыскания по коду. Возможно, это всего лишь устаревший взгляд и даже вредная привычка, так что всё нормально.
Извините, не понял, о чем это Вы.
Раздел Const и Var, разумеется.
Summary
Часто зная задачу можно лишь по количеству переменных оценить эффективность программы, а по названиями и типам переменных (и процедур / функций) - продвинутость самого автора.
Видите ли, наличие раздела var в Паскале - это уже глубокая история. Сейчас так не пишут. Еще раз: переменная описывается непосредственно перед или при первом использовании. Именно поэтому описатель var разрешено использовать везде, а не выносить за пределы основной программы. Даже такой язык, как бейсик - и тот давно перешел к концепции описания переменных по мере их использования.
Это что-то запредельное, для людей с экстрасенсорными способностями.
Я так пишу от лени.
Круто! Я вот от лени вообще никак не пишу.
У Вас просто ранняя стадия лени. На более взрослых стадиях становится лень лениться, и тогда начинаешь лениво писать книги. От ленивой лени обычно получаются интересные книги, которые самому не лень почитать.
Вообще программируют всё от лени делать всё руками
В конце-концов, неприлично делать самому то, что можно поручить другому. Даже если этот другой - компьютер.
Как насчёт добавить такую функцию в PABCSystem
?:
function Distinct<T1,T2>(self: sequence of T1; selector: T1->T2): sequence of T1; extensionmethod;
begin
var prev := new HashSet<T2>;
foreach var a in self do
if prev.Add(selector(a)) then
yield a;
end;
Необходимость такая же, как у .MaxBy
, то есть возможность получить результат, исходя из проекции элементов, вместо самих элементов.
Стандартный .Net-овский .Distinct
выглядит примерно так же (это перевод на паскаль, но оригинальный работает точно так же):
function Distinct<T>(self: sequence of T): sequence of T; extensionmethod;
begin
var prev := new HashSet<T>;
foreach var a in self do
if prev.Add(a) then
yield a;
end;
Тогда уже DistinctBy Я честно говоря не анализировал - там может быть еще много таких. MaxBy - уже невозможно было терпеть без неё.
Я тоже не анализировал, но .DistinctBy
давно не хватало…
Сейчас по всем методам последовательностей прошёлся - не хватает ещё только .AdjacentGroupBy
.
Ещё ни разу не видел применения .AdjacentGroup
, а вот .AdjacentGroupBy
, по крайней мере в задачках на куберфоруме - много где не хватало.
Для последнего предлагаю такую функцию:
function AdjacentGroupBy<T1,T2>(Self: sequence of T1; selector: T1->T2): sequence of (T2, List<T1>); extensionmethod;
begin
var last: List<T1>;
var last_key: T2;
foreach var a in Self do
begin
var key := selector(a);
if key<>last_key then
begin
if last<>nil then yield (last_key, last);
last_key := key;
last := new List<T1>;
end;
last += a;
end;
end;
И дополнительный класс из реализации .AdjacentGroup
не нужен. Я так понимаю вы использовали его для возможности применить .ToArray
… Вот только в .ToArray
тот же алгоритм добавления элементов что и у списка. Только .ToArray
в самом конце создаёт ещё 1 массив, который в случае списков - не нужен.
@Admin, может сделаете метку “namespaces”? Так вам (в особенности ibond’у) будет удобнее исправлять их. Поставить эту метку нужно на эти issue:
https://github.com/pascalabcnet/pascalabcnet/issues/1977 https://github.com/pascalabcnet/pascalabcnet/issues/2024 https://github.com/pascalabcnet/pascalabcnet/issues/2025 https://github.com/pascalabcnet/pascalabcnet/issues/2026 https://github.com/pascalabcnet/pascalabcnet/issues/2064 https://github.com/pascalabcnet/pascalabcnet/issues/2065 https://github.com/pascalabcnet/pascalabcnet/issues/2066 https://github.com/pascalabcnet/pascalabcnet/issues/2071 https://github.com/pascalabcnet/pascalabcnet/issues/2073
Сделал
В GraphWPF
нету ничего типа GetPixel[s]
. Единственная подпрограмма, как то считывающая содержимое окна - Window.Save
. Как то не хорошо, ради считывания области окна - обязательно использовать файл на диске.
Можете, пожалуйста, сделать что то типа GetPixels
, считывающего Array[,] of Color
?
К сожалению, в WPF такого нельзя сделать. Я исследовал этот вопрос. Я рисую не пиксели на экране - я рисую графические примитивы. И хранятся они до поры как графические примитивы
Ну всё окно то вы в файл сохраняете как то.
Посмотрите на строчку 1324 в GraphWPF
. Похоже - именно она берёт пиксели из готового окна и превращает в содержимое битмапа. Вот таким же образом но не в файл - а в оперативную память перекинуть бы…