检查字符是否包含在char数组中的最佳方法

时间:2016-02-23 20:16:30

标签: delphi delphi-xe4

我知道,我可以写

if C in ['#', ';'] then ...

如果CAnsiChar

但是这个

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

是否有一种简单的方法可以检查字符数组中是否包含字符(除了遍历数组)?

2 个答案:

答案 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的答案是更好的解决方案。