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?

Preguntas similare

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.
Respuesta Responder a este mensaje
#2 principiante
24/11/2007 - 01:34 | Informe spam
Es el clasico problema de que .NET no tenga macrosustitución :(

Quizas en la nueva version haya algo que te ayude mejor a eso, no se quizas
los arboles de expresion. Habria que chequear.

Jose TH



"Fernando Gómez" escribió en el mensaje
news:
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.
Respuesta Responder a este mensaje
#3 Alfredo Novoa
24/11/2007 - 02:00 | Informe spam
On Thu, 22 Nov 2007 14:32:12 -0400, "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?



Hay muchos evaluadores de expresiones ya hechos.
Googlea: c# expression evaluator.

Saludos
Respuesta Responder a este mensaje
#4 Erick \(foxero\)
24/11/2007 - 17:44 | Informe spam
Es el clasico problema de que .NET no tenga macrosustitución :(




Precisamente eso es.. No se que raro que no tenga algo parecido porque
hasta Sql server tiene una instruccion EXEC para ejecutar codigo dinamico.


Erick
Respuesta Responder a este mensaje
#5 Octavio Hernandez
27/11/2007 - 14:10 | Informe spam
Erick,

Mira el artículo "Compilación al vuelo de código" de José M. Alarcón, en la
dotNetManía nº 2
(te puedes descargar gratis el PDF de la revista y el código fuente de
ejemplo, que precisamente
es un evaluador de expresiones):

http://www.dotnetmania.com/Articulo...index.html

Salu2 - Octavio



"Erick (foxero)" <eric> wrote in message
news:%
Es el clasico problema de que .NET no tenga macrosustitución :(




Precisamente eso es.. No se que raro que no tenga algo parecido porque
hasta Sql server tiene una instruccion EXEC para ejecutar codigo dinamico.


Erick

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida