2012-07-05 15 views
6

quiero tomar una expresión matemática que toma las variables y de impresión (asignar a cadena) la fórmula con las variables llenados.imprimir los valores de una expresión como una cadena

int iTwo = 2; 
int iResult = 0; 

iResult = iTwo * iTwo; 

string theString = (iTwo * iTwo).ToString(); 

En la iResult el código de seguridad = 4 y elString = "4"

me gustaría hacer algo que llena en las variables y devuelve la expresión matemática como:

theString = (iTwo * iTwo).ExpressionToString();  

y terminar con elString = "2 * 2";

¿Pensamientos?

+0

Buenas ideas hasta ahora chicos, pero aquí está la complicación ... Hoy la expresión podría ser: itwo * itwo ... pero mañana la expresión podría ser: (itwo * itwo)/anotherVar ... Tengo que convertir cualquier número de vars a sus valores y luego convertir a cadena (manteniendo operadores, paréntesis, etc. en su lugar. En otras palabras, tendré diferentes expresiones que necesitan ser evaluadas y convertidas en cadenas. – pStan

Respuesta

4

Puede usar el tipo Expression<>.

public static string ExpressionToString<T>(Expression<Func<T>> e) 
{ 
    var un = e.Body as BinaryExpression; 
    if (un != null) 
    { 
     var left = un.Left.ToString(); 
     var leftEnd = left.Split('.').LastOrDefault(); 
     var right = un.Right.ToString(); 
     var rightEnd = right.Split('.').LastOrDefault(); 
     return e.Body.ToString().Replace(left, leftEnd).Replace(right, rightEnd); 
    } 
    return e.Body.ToString(); 
} 

Console.WriteLine(ExpressionToString(() => iTwo * iTwo)); 

//prints (iTwo * iTwo) 

Tendrá que hacer el método más complejo de analizar las cosas más complejas que una simple expresión binaria, pero esa es la idea general. Simplemente puede hacer e.Body.ToString(), pero debido a la forma en que se crean los tipos anónimos para sus lambdas, puede obtener resultados desagradables, por ejemplo: "(value(TestApp.Program+<>c__DisplayClass3).iTwo * value(TestApp.Program+<>c__Dis playClass3).iTwo)".

+1

Esto es bueno porque entonces él puede compilar la expresión y ejecutarla. – Gabe

0

Se puede crear su propio método que llama algo similar a esto:

public string ExpressionToString(int parameter1, string operator, int parameter2) { 
    return string.Format("{0} {1} {2}", parameter1, operator, parameter2); 
} 
0

Utilice crear su método y utilizar a continuación código en él para lograr su requerimiento

string answer = string.Format("{0} {1} {2} = {3}", iTwo, iTwo, operator, result); 
0
string ExpressionToString(int first, string operator, int second) 
{ 
    StringBuilder sb = new StringBuilder(); 
    sb.Append(first.ToString()); 
    sb.Append(operator); 
    sb.Append(second.ToString()); 
    return sb.ToString(); 
} 
0
public static string ExpressionToString(params object[] param) 
{ 
    return string.Join(" ", param.Select(t => t.ToString()).ToArray()); 
} 

usando:

string result = Helper.ExpressionToString(2, "*", 2 , ">=", -10); 
//result = "2 * 2 >= -10"; 
1

Con algunos operadores de sobrecarga ...

class Expression { 

    string exprStr; 

    public static explicit operator Expression(int value) { 
     return new Expression() { exprStr = value.ToString() }; 
    } 

    public static Expression operator *(Expression exp, int value) { 
     return new Expression() { exprStr = exp.exprStr + " * " + value.ToString() }; 
    } 

    public override string ToString() { 
     return exprStr; 
    } 

} 

class Program { 
    static void Main() { 
     int iTwo = 2; 
     string theString = ((Expression)iTwo * iTwo).ToString(); 
    } 
} 

Se podría, por supuesto, la necesidad de sobrecargar los demás operadores que necesita de una manera similar (por ejemplo, +, / y así sucesivamente).
También debe proporcionar métodos que acepten otros tipos distintos de int si los necesita, pero la idea básica sigue siendo la misma.

Tenga en cuenta que debe convertir a Expression solo el primer operando, de lo contrario solo obtendría el resultado que desea convertir.

1

Puede usar Expression<> y la información del parámetro almacenada en la expresión para obtener lo que desea. Almacene su expresión en una variable Expression<>.

int n1 = 4; 
int n2 = 3; 
Expression<Func<int, int, int>> exp = (arg1, arg2) => arg1 * arg2; 

string expString = exp.ToString(); // (arg1, arg2) => arg1 * arg2 
int startRHS = expString.IndexOf("=>") + 2; // starting index of RHS 
string onlyRHS = expString.Substring(startRHS).Trim(); // arg1 * arg2 

// replace args with values 
string withValues = onlyRHS.Replace(exp.Parameters[0].Name, n1.ToString()); // 4 * arg2 
withValues = withValues.Replace(exp.Parameters[1].Name, n2.ToString()); // 4 * 3 

Aunque esta no es la solución más robusta, funciona para escenarios simples.

Cuestiones relacionadas