我知道,我可以写
if C in ['#', ';'] then ...
如果C
是AnsiChar
。
但是这个
function CheckValid(C: Char; const Invalid: array of Char; OtherParams: TMyParams): Boolean;
begin
Result := C in Invalid; // <-- Error because Invalid is an array not a set
//maybe other tests...
//Result := Result and OtherTestsOn(OtherParams);
end;
收益E2015: Operator not applicable to this operand type
。
是否有一种简单的方法可以检查字符数组中是否包含字符(除了遍历数组)?
答案 0 :(得分:7)
我知道你不想这样做,但是出于性能原因,迭代数组确实是你最好的选择之一:
function CheckValid(C: Char; const Invalid: array of Char): Boolean;
var
I: Integer;
begin
Result := False;
for I := Low(Invalid) to High(Invalid) do begin
if Invalid[I] = C then begin
Result = True;
Exit;
end;
end;
end;
或者:
function CheckValid(C: Char; const Invalid: array of Char): Boolean;
var
Ch: Char;
begin
Result := False;
for Ch in Invalid do begin
if Ch = C then begin
Result = True;
Exit;
end;
end;
end;
将输入数据转换为字符串只是为了搜索它可能会导致巨大的性能瓶颈,尤其是在经常调用该函数时,例如在循环中。
答案 1 :(得分:0)
如果一个人试图避免迭代数组而如果速度无关紧要那么IndexOfAny
会有所帮助:
function CheckValid(C: Char; const Invalid: array of Char; OtherParams: TMyParams): Boolean;
begin
Result := string(C).IndexOfAny(Invalid) >= 0;
//maybe other test...
//....
end;
来自Delphi文档:
[IndexOfAny r] eturns一个整数,表示在基于0的字符串中找到的第一个给定字符的位置。 [如果找不到该字符,则返回-1。]
如果关注速度,应该避免这种情况,因为@RemyLebeau在评论中解释道:
将C转换为String以调用IndexOfAny()将创建1个临时字符串。 [...]如果经常调用CheckValid(),那些转换可能是一个很大的性能瓶颈,更不用说浪费内存了。
在这种情况下,@ RemyLebeau的答案是更好的解决方案。