私はこのようなことをしたい:
Result = 'MyString' in [string1, string2, string3, string4];
これは文字列では使用できず、次のようなことはしたくありません。
Result = (('MyString' = string1) or ('MyString' = string2));
また、これを行うためにStringListを作成するのは複雑すぎると思います。
これを達成する他の方法はありますか?
ありがとう。
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
関数もあることに注意してください。 -ラリー
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;
これがその仕事をする関数です:
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ループを終了できます。