Он не выводит массивы, списки и т.п. Он выводит последовательности. А последовательности бывают бесконечные.
Понял. Одна процедура для различных типов.
А можно как-то узнать конечность или бесконечность, чтобы добавлять … только для последних ?
Спасибо.
Конечные последовательности наследуют от ICollection
.
Если в PABCSystem
заменить строку 3487 на
while g.MoveNext() and ((o is System.Collections.ICollection) or (cnt < nmax)) do
Конечные последовательности будет выводить до конца.
@Admin что думаете?
Если надо последовательности выводить до конца - преобразуйте в строку на свой страх и риск. Но последовательности могут быть очень большими
Согласен с тем, что вывод заведомо очень длинных последовательностей на экран - это скорее просчёт программиста. А есть переменная или другая возможность задавать порог количества выводимых элементов ? nmax меняется извне ?
Writeln
- не позволит выводить последовательности длинной больше 100 элементов. Но Print/Println
- не даёт таких ограничений.
/// Выводит последовательность на экран, используя delim в качестве разделителя
function Print<T>(Self: sequence of T; delim: string): sequence of T; extensionmethod;
begin
var g := Self.GetEnumerator();
if g.MoveNext() then
Write(g.Current);
while g.MoveNext() do
if delim <> '' then
Write(delim, g.Current)
else Write(g.Current);
Result := Self;
end;
/// Выводит последовательность на экран, используя пробел в качестве разделителя
function Print<T>(Self: sequence of T): sequence of T; extensionmethod;
begin
if typeof(T) = typeof(char) then
Result := Self.Print('')
else
Result := Self.Print(PrintDelimDefault);
end;
/// Выводит последовательность на экран, используя delim в качестве разделителя, и переходит на новую строку
function Println<T>(Self: sequence of T; delim: string): sequence of T; extensionmethod;
begin
Self.Print(delim);
Writeln;
Result := Self;
end;
/// Выводит последовательность на экран, используя пробел качестве разделителя, и переходит на новую строку
function Println<T>(Self: sequence of T): sequence of T; extensionmethod;
begin
if typeof(T) = typeof(char) then
Result := Self.Println('')
else
Result := Self.Println(PrintDelimDefault);
end;
Благодарю @Sun_Serega за корректировку ответа.
Жаль, но понятно. Хотя не совсем ясно зачем в примере считать 100000 простых чисел, если выводится лишь около сотни последних.
Нет ну почему, у того же .Println
нет такого ограничения, вот его и используйте.
begin
(new byte[150]).Println;
end.
Инструментарий всегда надо знать. С оговоркой по Жванецкому:
Если, конечно, Вас интересует результат
После ознакомления со справкой и примерами у меня возник вопрос:
А откуда лично вы узнали о
var primes := Range(2, n).ToHashSet;
и как пришли к подобному решению?
"Всем хорошим во мне я обязан книгам"
М. Горький
На официальном сайте уже выложено достаточно информации, чтобы знать не только то, о чем Вы спросили. Почему бы Вам не попытаться хотя бы поверхностно ознакомиться с этим материалом?
Кроме книг, так же из источников информации:
-
На главной странице офф сайта есть несколько презентаций. Их мало и они короткие, но разок прочитать стоит, найдёте много интересного и полезного;
-
Когда вы наводите мышкой на что то, нажимаете Ctrl+Space или ставите точку - вам показывает тонну полезной информации по данному контексту;
-
Если поставить курсор на то что не понятно - можно нажать F1 - откроется справка на нужной странице;
-
Для всего паскалевского открывается паскалевская справка, но для вещей вроде
.ToHashSet
- откроется сайт msdn, который является справкой .Net; -
Когда не знаете как что то сделать - лучше всего искать на StackOverflow, с тегом
[c#]
, потому что всё из C# есть в паскале, перевести можно строчка в строчку.
Полезность информации - это такая тонкая штука! Уж череcчур сильно она пересекается с другим свойством информации - ее своевременностью. Пока найдешь в тонне “полезной информации” свое жемчужное зерно, твой поезд может уйти.
Просмотреть всё что отображается по точке для System
- это максимум пару часов. Хотя я и сам так не делал, я его по частям смотрел.
Кники как раз всегда больше чем на 2 часа отстают от современности)).
Современность и своевременность - это, как говорят в Одессе, “две большие разницы”.
Вопрос был не о том.
Абрамяна как раз читаю, а у Осипова посмотрел единственное упоминание “hashset” на странице 135 в разделе “Множества” и понял, что-то пропустил или же придётся читать в другом месте. А Вы эрудит или где-то узнавали и для какой-то задачи?
Про HashSet будет в части 10 “Стандартные коллекции”. Вот рабочий фрагмент Фрагмент.pdf (435,0 КБ) Он пока не окончательный, но что-то Вы там найти сможете.
Просто попробуйте навести курсор мыши на мою иконку и подождать всплывающую подсказку.
P.S. Так и вспоминается фраза из кинофильма “Кин-Дза-Дза!”:>
Девочка, вы тут самые умные? Это вам кто-нибудь сказал, или вы сами решили?
Спасибо, рано спросил. Я уже понял что Вы автор или прямо причастны к написанию книги, но это не раскрывает как вы узнали и для чего начали применять такую возможность.
Для меня пока очень много особенностей Pascal Abc .Net, о которых я даже не догадывался. Жду полную версию, чтобы научиться.
Узнавать приходилось из Справки и презентаций на официальном сайте. Путем изучения контрольных примеров, идущих в комплекте поставки. Помогло общение на форуме. А для чего применять… чтобы научиться писать современный код. Изучить современные технологии программирования.
Если Вы о моей книге - ждать не надо. Можно открывать с начала и начинать разбираться, потому что с первых же страниц предлагается писать программы в современном стиле.
Подробная информация об использовании оперативной
(JIT) отладки вместо данного диалогового
окна содержится в конце этого сообщения.
************** Текст исключения **************
System.ArgumentOutOfRangeException: Длина не может быть меньше нуля.
Имя параметра: length
в System.String.Substring(Int32 startIndex, Int32 length)
в VisualPascalABC.OutputWindowForm.InputTextBox_TextChanged(Object sender, EventArgs e)
в System.Windows.Forms.Control.OnTextChanged(EventArgs e)
в System.Windows.Forms.Control.set_Text(String value)
в System.Windows.Forms.TextBoxBase.set_Text(String value)
в System.Windows.Forms.TextBox.set_Text(String value)
в VisualPascalABC.WorkbenchRunService.UpdateReadRequest(Boolean changeSelected)
в VisualPascalABC.Form1.ChangedSelectedTab()
в System.Windows.Forms.Form.OnActivated(EventArgs e)
в System.Windows.Forms.Form.set_Active(Boolean value)
в System.Windows.Forms.Form.ActivateMdiChildInternal(Form form)
в System.Windows.Forms.Form.WmMdiActivate(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Возникло при отладке программы на функции Read(). Больше не наблюдал этого, но вопрос:
В чем точная причина данной ошибки? Какие, вероятнее всего, действия привели к возникновению данного исключения?