在Delphi中检查关键字列表中关键字的最快方法是什么?

前端之家收集整理的这篇文章主要介绍了在Delphi中检查关键字列表中关键字的最快方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一小部分关键字.我真正想做的是类似于:
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中重写这个的最佳方法是什么,这样既简单又易懂,而且速度快?

(供参考,我使用带有Unicode字符串的Delphi 2009.)

跟进:

托比建议我只使用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

在Barry对Kornel的问题的评论中,他提到了TDictionary Generic.我还没有接受新的Generic系列,看起来我应该深入研究它们.我在这里的问题是它们是否是为了效率而建立的,以及如何使用TDictionary在外观和速度上与上述两行进行比较?

在后来的分析中,我发现字符串的连接如:(”MyKeyword”)在时间上非常昂贵,应该尽可能避免.几乎任何其他解决方案都比这样做更好.

解决方法

大多数情况下,我使用StrUtils的IndexText函数来实现此目的.它类似于你的pos方法,但返回值与字符串的单独长度无关.作为一个噱头,它也是不区分大小写的(如果你不想要这个,请使用IndexStr).
function IndexText(const AText: string; const AValues: array of string): Integer; overload;

对这些函数的注释实际上提到了case构造:

{ AnsiMatchText & AnsiIndexText provide case like function for dealing with strings }

猜你在找的Delphi相关文章