web-dev-qa-db-ja.com

文字列がリストにあるかどうかを確認する最良の方法(ジェネリックなし)

私はこのようなことをしたい:

Result = 'MyString' in [string1, string2, string3, string4];

これは文字列では使用できず、次のようなことはしたくありません。

Result = (('MyString' = string1) or ('MyString' = string2));

また、これを行うためにStringListを作成するのは複雑すぎると思います。

これを達成する他の方法はありますか?

ありがとう。

26
Fabio Gomes

AnsiIndexText(const AnsiString AText、const array of string AValues):integerまたはMatchStr(const AText:string; const AValues:array of string):Boolean;を使用できます。

何かのようなもの

Result := (AnsiIndexText('Hi',['Hello','Hi','Foo','Bar']) > -1);

または

Result := MatchStr('Hi', ['foo', 'Bar']); 

AnsiIndexTextは、ATextに一致するAValuesで最初に見つかった文字列の0オフセットインデックスを返しますcase-insensitively。 ATextで指定された文字列のAValuesで(大文字と小文字が区別されない可能性のある)一致がない場合、AnsiIndexTextは-1を返します。比較は、現在のシステムロケールに基づいています。

MatchStrは、配列AValues内の文字列のいずれかが、大文字と小文字を区別する比較を使用してATextで指定された文字列と一致するかどうかを判断します。配列内の文字列の少なくとも1つが一致する場合はtrueを返し、一致する文字列がない場合はfalseを返します。

AnsiIndexTextでは大文字と小文字が区別されず、MatchStrでは大文字と小文字が区別されるため、用途によって異なります。

編集:2011-09-:この答えを見つけて、Delphi 2010にはMatchTextと同じですが大文字と小文字を区別しないMatchStr関数もあることに注意してください。 -ラリー

57
Re0sless

Burkhardによるコードは機能しますが、一致するものが見つかった場合でも、リストを不必要に繰り返します。

より良いアプローチ:

function StringInArray(const Value: string; Strings: array of string): Boolean;
var I: Integer;
begin
  Result := True;
  for I := Low(Strings) to High(Strings) do
    if Strings[i] = Value then Exit;
  Result := False;
end;
7
gabr

これがその仕事をする関数です:

function StringInArray(Value: string; Strings: array of string): Boolean;
var I: Integer;
begin
  Result := False;
  for I := Low(Strings) to High(Strings) do
  Result := Result or (Value = Strings[I]);
end;

実際、MyStringをStringsの各文字列と比較します。一致するものが1つ見つかるとすぐに、forループを終了できます。

1
Burkhard