我必须将部分字符串“SKILL_______EU_______WAND_______CLERIC_______BASE_____01”与“SKILL”进行比较。这是为了检查前四个字符是否为“SKILL”。或仅限第一个字符,此处需要进行优化!
我的问题:
谢谢!
答案 0 :(得分:11)
对于区分大小写的StrUtils.AnsiStartsText使用StrUtils.AnsiStartsStr,不区分大小写 (将StrUtils添加到your uses子句中)
答案 1 :(得分:6)
现在35000次重复真的不是那么多,你做什么都没关系。
答案 2 :(得分:5)
如果你真的想要最好的速度,你必须自己写一点StartsWith功能。
// untested, case-sensitive
Function StartsWith(const find, text : string) : Boolean;
var i, len : integer;
begin
result := true;
len := Min(Length(find), Length(text));
For i := 1 to len do
Begin
if (find[i] <> text[i])
then begin
result := False;
break;
end;
End;
end;
答案 3 :(得分:1)
我认为Delphi例程非常优化且快速,所以只需使用它们即可。
var
position : Integer;
begin
// AnsiPos
// returns the position of a substring in a string
// or 0 if the substring isn't found
position := AnsiPos('SKILL', 'SKILL_______EU_______WAND_______CLERIC_______BASE_____01');
end;
答案 4 :(得分:1)
如果您只想检查第一个字符,可以这样做:
if 'S' = 'SKILL_______EU_______WAND_______CLERIC_______BASE_____01'[1] then
begin
showmessage('SKILL');
end
答案 5 :(得分:1)
无论您选择哪种解决方案,请记住实际测试和基准它与您当前的实施。
否则你只是猜测,而不是优化。
祝你好运!答案 6 :(得分:0)
我对Delphi了解不多,但我认为(在任何语言/框架/平台中)Regex是字符串扫描的最快方式......
您没有准确指定您要搜索的所有条件......
答案 7 :(得分:0)
为什么不这样做:
function StartsWith( const AMatchStr, ATestStr : string ) : boolean;
begin
Result := SameText( AMatchStr, copy( ATestStr, 1, Length( AMatchStr ));
end;
除了您的起始文本之外,这不会处理ATestStr的任何部分。 BRI
答案 8 :(得分:0)
如果您正在查看可以执行的前4/5个字符的内容
i:= Length('SKILL');
LeftStr('SKILL_______EU_______WAND_______CLERIC_______BASE_____01',i) = 'SKILL'
答案 9 :(得分:0)
if AnsiPos('SKILL', 'SKILL_______EU_______WAND_______CLERIC_______BASE_____01') > 0 then
我认为这应该可以完成这项工作,我不知道AnsiPos的速度,如果速度快或慢或其他什么。每当我想比较一些字符串时,它对我有用。 AnsiPos()会返回一个整数值,该值表示您正在寻找的字符串的起始索引。