У меня есть небольшой список ключевых слов. То, что я действительно хотел бы сделать, похоже на:
case MyKeyword of
'CHIL': (code for CHIL);
'HUSB': (code for HUSB);
'WIFE': (code for WIFE);
'SEX': (code for SEX);
else (code for everything else);
end;
К сожалению, оператор CASE нельзя использовать так для строк.
Я мог бы использовать прямую конструкцию IF THEN ELSE IF, например:
if MyKeyword = 'CHIL' then (code for CHIL)
else if MyKeyword = 'HUSB' then (code for HUSB)
else if MyKeyword = 'WIFE' then (code for WIFE)
else if MyKeyword = 'SEX' then (code for SEX)
else (code for everything else);
но я слышал, что это относительно неэффективно.
Вместо этого я делал следующее:
P := pos(' ' + MyKeyword + ' ', ' CHIL HUSB WIFE SEX ');
case P of
1: (code for CHIL);
6: (code for HUSB);
11: (code for WIFE);
17: (code for SEX);
else (code for everything else);
end;
Это, конечно, не лучший стиль программирования, но он отлично работает для меня и до сих пор не имел значения.
Итак, как лучше всего переписать это в Delphi, чтобы оно было одновременно простым, понятным и быстрым?
(Для справки, я использую Delphi 2009 со строками Unicode.)
Следовать за:
Тоби рекомендовал мне просто использовать конструкцию If Then Else. Оглядываясь на мои примеры, в которых использовался оператор CASE, я понимаю, насколько это жизнеспособный ответ. К сожалению, включение CASE случайно скрыло мой настоящий вопрос.
Меня вообще не волнует, какое это ключевое слово. Это просто бонус, если конкретный метод может идентифицировать его, как метод POS. Мне нужно знать, входит ли ключевое слово в набор ключевых слов.
Так что я действительно хочу знать, есть ли что-нибудь лучше, чем:
if pos(' ' + MyKeyword + ' ', ' CHIL HUSB WIFE SEX ') > 0 then
Эквивалент If Then Else в данном случае не выглядит лучше:
if (MyKeyword = 'CHIL') or (MyKeyword = 'HUSB') or (MyKeyword = 'WIFE')
or (MyKeyword = 'SEX') then
В комментарии Барри к вопросу Корнеля он упоминает TDictionary Generic. Я еще не ознакомился с новыми коллекциями Generic, и, похоже, мне стоит в них вникнуть. Мой вопрос здесь будет заключаться в том, созданы ли они для повышения эффективности и как с помощью TDictionary можно сравнить внешний вид и скорость с двумя приведенными выше строками?
При более позднем профилировании я обнаружил, что объединение строк, как в: ('' + MyKeyword + ''), ОЧЕНЬ дорого с точки зрения времени, и его следует по возможности избегать. Практически любое другое решение лучше, чем это.
in
набором значений. Выполнение этого один раз означает, что вам необходимо идентифицировать ключевое слово. Может быть, вам просто нужен правильный лексер в вашей программе? - person mghie   schedule 24.01.2010