Лучший способ узнать, есть ли строка в списке (без обобщений)
Я хочу сделать что-то вроде этого:
Result = 'MyString' in [string1, string2, string3, string4];
Это не может быть использовано со строками, и я не хочу делать что-то вроде этого:
Result = (('MyString' = string1) or ('MyString' = string2));
Также я думаю, что создание StringList для этого слишком сложно.
Есть ли другой способ достичь этого?
Благодарю.
4 ответа
Вы можете использовать AnsiIndexText(const AnsiString AText, const массив строк AValues): целое число или MatchStr(const AText: string; const AValues: массив строк): Boolean;
Что-то вроде
Result := (AnsiIndexText('Hi',['Hello','Hi','Foo','Bar']) > -1);
или же
Result := MatchStr('Hi', ['foo', 'Bar']);
AnsiIndexText возвращает 0-смещенный индекс первой строки, которую он находит в AValues, которая соответствует AText без учета регистра. Если строка, указанная AText, не имеет (возможно, без учета регистра) совпадения в AValues, AnsiIndexText возвращает -1. Сравнения основаны на текущей локали системы.
MatchStr определяет, соответствует ли какая-либо из строк в массиве AValues строке, указанной AText, с использованием сравнения с учетом регистра. Он возвращает истину, если хотя бы одна из строк в массиве совпадает, или ложь, если ни одна из строк не совпадает.
Заметка AnsiIndexText
имеет регистронезависимый и MatchStr
чувствителен к регистру, так что я думаю, это зависит от вашего использования
РЕДАКТИРОВАТЬ: 2011-09-3: Просто нашел этот ответ и подумал, что я хотел бы добавить примечание, что в Delphi 2010 также есть MatchText
функция, которая такая же, как MatchStr
но без учета регистра. - Ларри
Код Буркхарда работает, но без необходимости перебирает список, даже если совпадение найдено.
Лучший подход:
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. Как только вы найдете подходящее, вы можете выйти из цикла for.
Вы можете попробовать это:
Result := Pos(MyString, string1+string2+string3+string4) > 0