2008-10-29 9 views
26

quiero hacer algo como esto:mejor manera de saber si una cadena está en una lista (sin genéricos)

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

Esto no se puede utilizar con cuerdas y no quiero hacer algo como esto:

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

También creo que crear una StringList para hacer esto es demasiado complejo.

¿Hay alguna otra forma de lograr esto?

Gracias.

Respuesta

50

Usted podría utilizar AnsiIndexText (const AnsiString AText, const gama de aValores de cuerda): número entero o MatchStr (const AText: string; aValores const: array de cadenas): Boolean;

Algo así como

Result := (AnsiIndexText('Hi',['Hello','Hi','Foo','Bar']) > -1); 

o

Result := MatchStr('Hi', ['foo', 'Bar']); 

AnsiIndexText devuelve el 0-offset índice de la primera cadena que encuentra en aValores que coincide AText mayúsculas y minúsculas. Si la cadena especificada por AText no tiene una coincidencia (que no distingue entre mayúsculas y minúsculas) en AValues, AnsiIndexText devuelve -1. Las comparaciones se basan en la configuración regional actual del sistema .

MatchStr determina si cualquiera de los cadenas en los aValores matriz coinciden con la cadena especificado por AText usando un caso comparación sensible. Devuelve verdadero si al menos una de las cadenas en la matriz coincide, o es falso si ninguna de las cadenas coincide.

Nota AnsiIndexText tiene mayúsculas y minúsculas y MatchStr entre mayúsculas y minúsculas, así que supongo que depende de su uso

EDIT: 03/09/2011: Acabo de encontrar esta respuesta y pensaba que iba a poner una nota que, en Delphi 2010 también hay una función MatchText que es lo mismo que MatchStr pero insensible.- Larry

+0

En realidad, hay uno mejor, solo busqué un poco en StrUtils.pas y encontré el MatchStr que devuelve un booleano: Resultado: = MatchStr ('Hola' , ['foo', 'Bar']); Por favor, agréguela a su respuesta –

+0

MatchStr y MatchText también están disponibles en Delphi 2007. –

+0

cualquier equivalente para delphi 7? – CyprUS

1

Aquí es una función que hace el trabajo:

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; 

De hecho, usted compara MiCadena con cada cadena de cuerdas. Tan pronto como encuentre una coincidencia puede salir del ciclo for.

+0

Esto funciona, por favor, actualice su código con el Delphi uno: función StringInArray (Valor: string; Cuerdas: array de cadenas): Boolean; var I: Entero; begin Resultado: = False; para I: = Bajo (Cadenas) a Alto (Cadenas) do Resultado: = Resultado o (Valor = Cadenas [I]); final; –

+0

Es difícil ser un n00b y no poder editar cosas :( –

7

El código de Burkhard funciona, pero se repite sin necesidad sobre la lista, incluso si se encuentra una coincidencia.

mejor enfoque:

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; 
-4

Puede probar esto:

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

Lo sentimos, pero su solución da resultados positivos para las subcadenas de la cadenas cuando no debería, por ejemplo, Pos ('ca', 'cat' + 'perro') da 1, pero se necesita 0. Pos ('td', 'cat' + 'perro') da 3, pero 0 es necesario. – lkessler

+1

-1 para falsos positivos. –

+0

Peor solución, porque no es necesario concat todas las cadenas. La mejor solución es la @ Re0sless anterior. –

Cuestiones relacionadas