Лучший способ узнать, есть ли строка в списке (без обобщений) - PullRequest
26 голосов
/ 29 октября 2008

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

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

Это не может быть использовано со строками, и я не хочу делать что-то вроде этого:

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

Также я думаю, что создание StringList для этого слишком сложно.

Есть ли другой способ добиться этого?

Спасибо.

Ответы [ 4 ]

56 голосов
/ 29 октября 2008

Вы можете использовать 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 индекс первой найденной строки Значения, соответствующие AText регистронезависимо . Если строка указанный AText не имеет (возможно, без учета регистра) совпадения в AValues, AnsiIndexText возвращает -1. Сравнения основаны на текущем локаль системы.

MatchStr определяет, является ли какой-либо из строки в массиве AValues ​​соответствуют строка, указанная AText с использованием регистра чувствительное сравнение . Возвращает истину если хотя бы одна из строк в совпадение массива или false, если ни один из совпадение строк.

Примечание. AnsiIndexText чувствительно к регистру, а MatchStr чувствительно к регистру, поэтому, я думаю, это зависит от вашего использования

РЕДАКТИРОВАТЬ: 2011-09-3 : Просто нашел этот ответ и подумал, что я хотел бы добавить примечание, что в Delphi 2010 также есть функция MatchText, которая такая же, как MatchStr, но регистр нечувствителен - Ларри

7 голосов
/ 29 октября 2008

Код Буркхарда работает, но без необходимости перебирает список, даже если совпадение найдено.

Лучший подход:

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;
1 голос
/ 29 октября 2008

Вот функция, которая выполняет эту работу:

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.

0 голосов
/ 10 декабря 2010

Вы можете попробовать это:

Result := Pos(MyString, string1+string2+string3+string4) > 0
...