在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构造:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |