Набор строк? - PullRequest
       19

Набор строк?

7 голосов
/ 30 июня 2010

Вы знакомы с этим блоком:

Var
  mySet: Set Of Char;
  C: Char;
begin
  mySet := ['a', 'b', 'c'];
  If C In mySet Then ShowMessage('Exists');
end;

Есть ли способ объявить Set Of STRING? или есть подобный код, который я могу использовать вместо? Важной частью этого блока является If C In mySet Then ShowMessage('Exists'); Я хочу использовать что-то вроде этого в наборе строк.
Спасибо.

Ответы [ 4 ]

11 голосов
/ 30 июня 2010

Наборы реализованы с использованием битовых массивов. Так что нет, вы не можете иметь «набор строк». Вместо этого используйте TStringList, то есть:

var 
  mySet: TStringList;
  S: String;
begin 
  S := ...;
  mySet := TStringList.Create;
  try
    mySet.Add('a');
    mySet.Add('b');
    mySet.Add('c'); 
    if mySet.IndexOf(S) <> -1 Then ShowMessage('Exists');
  finally
    mySet.Free;
  end;
end; 
9 голосов
/ 06 июля 2010

Вы можете использовать это.

type 
  TAnyEnum = (aeVal1, aeVal2, aeVal3);
  TEnuns = set of TAnyEnum;
  TAnyMessages: array [TAnyEnum] of String;

const 
  MyMessages: TAnyMessages = ('Exists', 'Something else', 'WTF!?');

var
  MySet : TEnums;
begin
  MySet = [aeVal1, aeVal2];
  If aeVal1 in MySet then ShowMessage(MyMessages[aeVal1]);
end;
5 голосов
/ 09 декабря 2018

Устройство RTL System.StrUtils предоставляет очень интересный метод для этого:

function MatchText(const AText: string; const AValues: array of string): Boolean; overload;

Используйте его так:

  if MatchText(sLanguages, ['fr-FR', 'en-GB', 'de-DE', 'it-IT', 'fr-CH', 'es-ES']) then
    Writeln('found')
3 голосов
/ 27 июля 2013

Это позор, но в Delphi до сих пор нет даже самых базовых структур данных, таких как наборы. Предложение «Fabricio Araujo» очень ограничено в использовании - вы должны знать все возможные строки, поэтому бесполезно, когда вы читаете их откуда-то. Также невозможно иметь более 256 элементов в таком «почти любом наборе строк». Реми Лебо предложил использовать TStringList для этой цели, но это абсолютно неэффективно, когда у вас большие наборы. В современных версиях Delphi можно использовать TDictionary для сохранения неупорядоченного набора чего-либо, включая строки:

procedure TForm6.FormCreate(Sender: TObject);
type
  TEmpty = record end;
var
  MySet: TDictionary<String, TEmpty>;
  Dummy: TEmpty;
begin
  MySet := TDictionary<String, TEmpty>.Create;
  try
    MySet.Add('Str1', Dummy);
    MySet.Add('Str2', Dummy);
    MySet.Add('Str3', Dummy);
    if MySet.TryGetValue('Str2', Dummy) then
      ShowMessage('Exists');;
  finally
    MySet.Free;
  end;
end;

Он чувствителен к регистру. Если вам нужна реализация без учета регистра, вы можете сделать все строки в нижнем регистре перед положением / просмотром, а затем в set (для этого используйте функцию AnsiLowerCase).

...