Помощь новичкам

- Да позволено мне будет узнать, что ты, о бриллиант моей души,  подразумеваешь
под этим неизвестным мне словом "балда"?  -  с  любопытством осведомился Хоттабыч.
Волька покраснел, как морковка.
- Понимаешь ли... как тебе сказать... э-э-э...  Ну,  в  общем,  "балда" -
это что-то вроде мудреца.
                                        Л.Лагин. "Старик Хоттабыч".
2 лайка

Мнения разные, и я считаю, что критерии скорее не “новее-старее”, а “быстрее написать-легче понять” - и далее по приоритетам.

  1. Подскажите, как проще инициализировать структуру вида
var список:array['A'..'Z']of list<string>;

или же

for var c:='A'to'Z'do список:=new list<string>;

нормально вписывается в парадигму ? Пока что не придумал быстрый алфавитный указатель.

  1. В каждой отдельной строке текстового файла находится цифровая комбинация (может начинаться с нулей). Нужно сравнить этот файл со вторым и вывести в третий файл только совпадения.

Как бы просто: ввести первый файл в HashSet и читать второй файл, фильтруя совпадения. Но есть ли в данном случае не только рекомендательные, но и реальные преимущества у SortedSet или других структур ?

Вместо статичного массива можно использовать словарь (Dictionary), потому что в отличии от статичных массивов - это нормальный класс, которому не надо делать синоним чтоб его можно было передавать в методы.
Но инициализировать всё равно только через for. Более короткой записи в данном случае нет.

В общем я понимаю концепцию хэшей и возможные моменты, но есть нюанс с namespace или почему при объявлении

var dict:=new Dictionary<string, word>(system.StringComparer.InvariantCultureIgnoreCase);

в компараторе нужно указать модуль system ?

Потому что:

  1. System не модуль, а пространство имён.
  2. Dictionary описан в PABCSystem, то есть модуле который подрубается ко всему. А описан он так:
  /// Представляет ассоциативный массив (набор пар Ключ-Значение), реализованный на базе хеш-таблицы
  Dictionary<Key, Value> = System.Collections.Generic.Dictionary<Key, Value>;

Если прописать uses System - дальше писать System. не надо будет

Потому, что в Вашей программе пространство имён (!) System не подключено. Возможность же писать Dictionary без явной ссылки на System обуславливается тем, что за Вас в системном модуле, подключаемом неявно ко всему, прописан alias для Dictionary<,>:

  /// Представляет ассоциативный массив (набор пар Ключ-Значение), реализованный на базе хеш-таблицы
  Dictionary<Key, Value> = System.Collections.Generic.Dictionary<Key, Value>;

, но для компаратора IEqualityComparer<> подобного alias'a не сделано.

Ссылки:

Полезные материалы по .NET, технологиям программирования, алгоритмам и паттернам проектирования

Помогите. Не получается преобразовать в char. var C: char тоже не помог. procedure Form1.button1_Click(sender: Object; e: EventArgs); begin var c:=textbox1.Text; label1.Text := ord©; end;

Можно код вставить в форматированном виде? Желательно, также привести полный код, чтобы можно было самому его запустить и посмотреть.

Project33.rar (10,0 КБ)

string нельзя ни явно, ни неявно преобразовать в char. Можно, например, попробовать взять первый символ строки s[1]

А, ещё можно System.Convert использовать

System.Convert.ToChar(' ').Print;

Только он выдаст исключение, если длина строки будет больше единицы.

  1. @ahtam, первый символ строки при наличии директивы {$string_nullbased+} будет 0-евым её элементом. Если же использована {$string_nullbased-}, то эффект противоположный, и индексация начинается с 1-цы. По умолчанию (без явного указания данных директив) используется индексация с 1-цы. Дополнительную информацию о директивах компилятора можно посмотреть в: Справка > Справочник по языку > Директивы компилятора.

  2. Если ничего не вводить в поле, то Ваша программа упадёт с ошибкой: Unit1.pas(30) : Ошибка времени выполнения: Индекс находился вне границ массива. Требуется проверка на выход индекса за границы строки:

procedure Form1.button1_Click(sender: Object; e: EventArgs);
begin
  var  c:=textbox1.Text;
  if c.Length < 1 then
    exit;
  
  label1.Text := c[1];
end;

, но лучше не молча обрабатывать ошибочные случаи ввода, а сообщать пользователю об этом. Ниже приведены ссылки, по которым Вы можете узнать как это делать.

Ссылки:

Очень интересная информация.

Приятно было узнать, что она оказалась интересной кому-то.

Только что понял что форум выдал мне права переноса даже админских тем в другие разделы (раньше только созданные не_админами разрешало). И вот помнится эту тему хотели перенести в раздел паскаля, но @Admin не нашёл как…

Остаётся только вопрос - стоит ли это делать? Эту тему не отображает если с сайта перейти на форум, потому что она находится в разделе разное. Но в самоволку это делать не очень хочется.

1 лайк

Вау… очередной админ…))))))

Думаю, надо.

Все указанные вами способ я уже до этого экспериментировал, использовал другие функции COPY, SUBSTR, … Но результата для меня то, чтобы можно было затем использовать другие функции, например ord. label1.Text := ord(c[1]) или другая форма вҷдаёт тоже самую ошибку.

Потому что типы надо преобразовывать! Copy и s.Substring возвращают строку, а не символ. А вот Convert.ToChar или обращение к символу через индексатор строки как раз вернёт char. Обратно присвоить строке символ вроде можно без преобразований, там есть неявное приведение Но если так нужно, можно использовать c.ToString.

Во первых, спасибо Всем, кто оказал помощь и написал комментарий. Во вторых, сделал его чуть по другому и получилось. Project33.rar (11,2 КБ)