У меня есть маленький список ключевых слов. То, что я действительно хотел бы сделать, сродни:
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;
К сожалению, Оператор выбора не может использоваться как этот для строк.
Я ЗАТЕМ ЕЩЕ мог использовать прямое ЕСЛИ ЕСЛИ конструкция, например:
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.)
Продолжение:
Toby рекомендовал, чтобы я просто использовал, Если Затем Еще создают. Оглядываясь назад на мои примеры, которые использовали Оператор выбора, я вижу, как это - жизнеспособный ответ. К сожалению, мое включение СЛУЧАЯ непреднамеренно скрыло мой реальный вопрос.
Я на самом деле не забочусь, какое ключевое слово это. Это - просто премия, если конкретный метод может определить, что как метод POS может. То, в чем я нуждаюсь, должно знать, является ли ключевое слово в наборе ключевых слов.
Таким образом, действительно я хочу знать, существует ли что-нибудь лучше, чем:
if pos(' ' + MyKeyword + ' ', ' CHIL HUSB WIFE SEX ') > 0 then
Если Затем Еще эквивалентный не кажется лучше в этом случае том, чтобы быть:
if (MyKeyword = 'CHIL') or (MyKeyword = 'HUSB') or (MyKeyword = 'WIFE')
or (MyKeyword = 'SEX') then
В комментарии Barry к вопросу Kornel он упоминает Дженерик TDictionary. Я еще не взял на новых Универсальных наборах, и похоже, что я должен копаться в них. Мой вопрос здесь состоял бы в том, создаются ли они для эффективности и как был бы с помощью TDictionary выдержать сравнение во взглядах и в скорости к вышеупомянутым двум строкам?
В более позднем профилировании я нашел что конкатенация строк как в: (' '+ MyKeyword + ''), ОЧЕНЬ дороги мудрый временем и должен избежаться, когда это возможно. Почти любое другое решение лучше, чем выполнение этого.