Restriccion en un string

22/11/2007 - 19:32 por Erick \(foxero\) | Informe spam
Tengo en una variable un string con una condicion respecto a una propiedad
de una clase. Ejemplo: "propiedad>2".

Yo necesito convertir ese string a un valor booleano es decir algo como
evaluar esa expresion, como puedo hacer eso?
 

Leer las respuestas

#1 Fernando Gómez
23/11/2007 - 18:48 | Informe spam
On Nov 22, 12:32 pm, "Erick \(foxero\)" <eric> wrote:
Tengo en una variable un string con una condicion respecto a una propiedad
de una clase. Ejemplo: "propiedad>2".

Yo necesito convertir ese string a un valor booleano es decir algo como
evaluar esa expresion, como puedo hacer eso?



Mmm... lo que pides es algo complicado. Tienes que hacer un analizador
sintáctico (pequeño, por supuesto) el cuál parseará la cadena de
texto. Luego, tienes un arbol binario donde vas insertando las
operaciones: el nodo padre será el operador (en tu caso, >) y tendrá
dos hijos, el lvalue y el rvalue (en tu caso, "propiedad" y "2"). Por
ejemplo, en tu caso, tendrías el siguiente árbol

+
|-+ >
|-+ propiedad
|-+ 2

Pero podrías tener expresiones más complicadas como:

"propiedad>2 && propiedad < 10"

de donde tendrías el árbol:

+
|- &&
|- >
|- propiedad
|- 2
|- <
|- propiedad
|- 10

La idea es que, una vez que hayas formado tu árbol, evalues de abajo
hacia arriba, de la última hoja hasta la raíz. Y en cada nodo vayas
guardando el valor lógico de la expresión.

Ahoooooooooora que si lo que quieres es algo sencillo y solo tendrás
un operador (digamos, <, > e =), pues basta con hacer algo como:

string lvalue;
string rvalue;
string op;
int opPos;

string str = "propiedad > 2"; // a evaluar

str.Trim();
opPos = str.IndexOfAny('>', '<', '=');
op = str.Substring(opPos, 1);
lvalue = str.Substring(0, opPos-1);
rvalue = str.Substring(opPos+1);

Y en este momento, tenemos que op = ">", lvalue = "propiedad" y rvalue
= "2". Ahora solo tienes que aplicar tu evaluación. En esencia aquí
también estamos creando un árbol, donde op es el nodo y tanto lvalue
como rvalue son las hojas. Pero mucho más sencillo, por supuesto.

Ahora bien, para evaluar la expresión, necesitaría más detalles sobre
a qué se refiere eso de "propiedad". Lo que he entendido es que tienes
algo como:

public int Propiedad
{
get { ... } set { ... }
}

Y luego en un string tienes "Propiedad > 2", y ¿quieres evaluar en
base a eso si tu propiedad Propiedad es igual a 2?

Saludos.

Preguntas similares