Лучший способ узнать, есть ли строка в списке (без обобщений)

Я хочу сделать что-то вроде этого:

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
Другие вопросы по тегам