Il modo migliore per scoprire se una stringa è in un elenco (senza generici)
-
05-07-2019 - |
Domanda
Voglio fare qualcosa del genere:
Result = 'MyString' in [string1, string2, string3, string4];
Questo non può essere usato con le stringhe e non voglio fare qualcosa del genere:
Result = (('MyString' = string1) or ('MyString' = string2));
Inoltre penso che creare una StringList per fare proprio questo sia troppo complesso.
Esiste un altro modo per raggiungere questo obiettivo?
Grazie.
Soluzione
Potresti usare AnsiIndexText (const AnsiString AText, const array di string AValues): integer o MatchStr (const AText: string; const AValues: array di string): Boolean;
Qualcosa di simile
Result := (AnsiIndexText('Hi',['Hello','Hi','Foo','Bar']) > -1);
o
Result := MatchStr('Hi', ['foo', 'Bar']);
AnsiIndexText restituisce l'offset 0 indice della prima stringa in cui trova Valori corrispondenti a AText è case-sensitive . Se la stringa specificato da AText non ha un (possibilmente senza distinzione tra maiuscole e minuscole) Valori, AnsiIndexText restituisce & # 8211; 1. I confronti si basano sulla corrente impostazioni locali del sistema.
MatchStr determina se uno dei le stringhe nell'array AValues ??corrispondono a stringa specificata da AText utilizzando un caso confronto sensibile . Restituisce vero se almeno una delle stringhe nel file array match, o false se nessuno dei le stringhe corrispondono.
Nota AnsiIndexText
ha la distinzione tra maiuscole e minuscole e MatchStr
fa distinzione tra maiuscole e minuscole, quindi immagino che dipenda dal tuo utilizzo
EDIT: 2011-09-3 : ho appena trovato questa risposta e ho pensato di aggiungere una nota che, in Delphi 2010, esiste anche una funzione MatchText
che è la uguale a MatchStr
ma senza distinzione tra maiuscole e minuscole. - Larry
Altri suggerimenti
Il codice di Burkhard funziona, ma scorre inutilmente sull'elenco anche se viene trovata una corrispondenza.
Approccio migliore:
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;
Ecco una funzione che fa il lavoro:
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;
In effetti, si confronta MyString con ogni stringa in Stringhe. Non appena ne trovi uno corrispondente, puoi uscire dal ciclo for.
Puoi provare questo:
Result := Pos(MyString, string1+string2+string3+string4) > 0