Использование строк в качестве дискриминантных переменных в операторе Case Delphi. Chen Jiaxin╱[email protected]. При упоминании операторов Case во введении первый случай применения, который приходит на ум, — это использование переменных, позволяющих потоку программы выбирать подходящий путь для продолжения выполнения в соответствии с различными условиями. Или, когда в нашей программе есть ряд комбинаций операторов if и else if, мы часто думаем об использовании операторов Case, чтобы упростить программный код и улучшить его читаемость и эффективность выполнения. Однако в некоторых случаях операторы Case не могут быть применены к нашим программам, поскольку допускаемые ими дискриминантные переменные ограничены любой формой 咚闶剑╡xPRession) и порядковым типом. Это так называемые «Порядковые типы» относятся к «упорядоченным». " такие как целые числа, символы, перечисления, логические значения и множества, и могут применяться к таким вещам, как Ord(), Pred(), Succ(), Low() и High(). Тип выражения (см. [1]) . К сожалению, строка (string) явно не является порядковым типом, и в какой-то момент (пример будет приведен ниже), когда типом условной переменной является строка и условных ветвей довольно много, хотя это и беспомощно, однако, увы, похоже, нет другого способа, кроме использования большого количества операторов if и else if. Например, в Delphi недопустим следующий код: #001 var #002 Str: String; // Объявить дискриминантную переменную строкового типа #003 start #004 case Str of // Сообщение об ошибке: Требуется порядковый номер #005 / / ... #006 end; #007 end;Это просто невозможно скомпилировать, поэтому традиционное решение обычно состоит в том, чтобы преобразовать его в комбинацию большого количества операторов if и else if. На данный момент мне бы очень хотелось использовать Visual Basic, поскольку его компилятор допускает следующий код (см. [5]): #001 Dim Str As String ' Объявляет дискриминантную переменную типа String #002 Select Case Str ' эквивалентен к оператору Case #003 '... #004 End Select ' ОК, посредством компиляции Итак, в этой статье автор пытается использовать эту проблему в качестве отправной точки в дополнение к преобразованию в комбинацию операторов if и else if. «Ищу другие возможные решения, помимо традиционных решений», и искренне надеюсь, что эта статья может быть полезна людям, которые столкнулись с этой проблемой и стремятся найти решение (после прочтения [12]–[14] автор также обнаружил, что это действительно так) Помогает. Сначала позвольте мне дать вам предварительный просмотр. Я планирую представить 7 решений. Первые 5 методов представляют собой выдержки или расширения из [9]-[13], а шестой метод представляет собой комплексный мультизагрузчик, реализованный автором. версия. Это следующие варианты: v Вариант 1: Поиск по массиву строк v Вариант 2: Использовать действительный индекс v Вариант 3: Использовать хеш-функцию v Вариант 4: Вложенный оператор case v Вариант 5: Использовать TStringListv Вариант 6: Реализовать функцию множественной загрузки Решение 7: Применить Эта статья начнется с рассмотрения таких тем, как условные операторы (основное содержание см. в [1] и [4]) и строки распознавания (основное содержание см. в [2]). В этом разделе читайте раздел «Вопросы эффективности» непосредственно в конце статьи.