2011-06-12 28 views
12

tengo este código:¿Cómo puedo verificar si existe una cadena en una matriz?

var 
    ExtString: string; 
const 
    Extensions : array[0..4] of string = ('.rar', '.zip', '.doc', '.jpg', '.gif'); 

if ExtString in Extensions then 

En la última línea, me sale un error:

[DCC Error] E2015 Operator ('then') not applicable to this operand type

creo que no puedo hacer esto, así que ¿cómo puedo realizar adecuadamente mi tarea?

+0

** operador ** no es aplicable a estos tipos de operando –

+1

Esta es una explicación de por qué el intento de OP no funcionó, pero no es una respuesta real ya que la pregunta era "¿cómo puedo realizar esta tarea correctamente?" – jpfollenius

+0

Posible duplicado de [La mejor forma de encontrar si una cadena está en una lista (sin genéricos)] (http://stackoverflow.com/questions/246623/best-way-to-find-if-a-string-is- in-a-list-without-genics) –

Respuesta

18

Como has encontrado, no puedes buscar una Cadena en una Matriz de Cadenas, usando in.

Puede utilizar esta función en lugar de la instrucción if.

function StrInArray(const Value : String;const ArrayOfString : Array of String) : Boolean; 
var 
Loop : String; 
begin 
    for Loop in ArrayOfString do 
    begin 
    if Value = Loop then 
    begin 
     Exit(true); 
    end; 
    end; 
    result := false; 
end; 

Puede llamarlo así.

if StrInArray(ExtString,Extensions) then

El StrUtils.pas tiene esta ya definida.

function MatchStr(const AText: string; const AValues: array of string): Boolean; 
+4

+1 para MatchStr aunque desafortunadamente tiene un nombre. Debería ser un sustantivo en lugar de un verbo. Debo decir que no soy partidario de la nueva sintaxis de salida. Pero si vas a usarlo, ¿no deberías usarlo de manera consistente? Usar result y exit() en la misma rutina hace que sea más difícil de analizar. –

+3

Tenga cuidado con la distinción entre mayúsculas y minúsculas. El sistema de archivos no distingue entre mayúsculas y minúsculas y puede encontrar muchos archivos con la extensión .JPG. El código de arriba se perderá esto. – Misha

+1

@Misha: para eso es 'MatchText'. En algunas versiones de Delphi, solo existe como 'AnsiMatchText' (y quizás' WideMatchText' en 'WideStrings.pas'). – afrazier

8

Inicialice una instancia de TStringList de la matriz constante y use IndexOf().

+2

demasiado pesado, bucle simple mejor –

+1

No si se realiza con frecuencia y TStringList es persistente. ¿Quién sabe para qué más podría usarse esto? – Misha

+1

Haga que la lista de cadenas sea persistente y abandone la seguridad del hilo. Aun así tienes que asignar a la lista de cadenas que no tiene sentido. Loop es mejor, no hay dudas. La lista de cadenas es almádena para romper la nuez. –

Cuestiones relacionadas