我想采用一个数学表达式,它接受变量并打印(赋值给字符串)填充变量的公式。
int iTwo = 2;
int iResult = 0;
iResult = iTwo * iTwo;
string theString = (iTwo * iTwo).ToString();
在上面的代码中,iResult = 4,theString =“4”
我想做一些填充变量并返回数学表达式的东西,如:
theString = (iTwo * iTwo).ExpressionToString();
以string =“2 * 2”结束;
思考?
答案 0 :(得分:4)
您可以使用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)
您需要使方法更复杂,以解析比简单二进制表达式更复杂的事情,但这是一般的想法。您可以e.Body.ToString()
,但由于为您的lambdas制作匿名类型的方式,可能会产生难看的结果,例如:"(value(TestApp.Program+<>c__DisplayClass3).iTwo * value(TestApp.Program+<>c__Dis
playClass3).iTwo)"
。
答案 1 :(得分:1)
有些运营商超载......
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();
}
}
您当然需要以类似的方式重载您需要的其他运算符(例如+
,/
等)。
如果需要,你还应该提供接受除int之外的其他类型的方法,但基本思想保持不变。
请注意,您必须仅将第一个操作数强制转换为Expression,否则只能转换结果。
答案 2 :(得分:1)
您可以使用Expression<>
和表达式中存储的参数信息来获取您想要的内容。将表达式存储在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
虽然这不是最强大的解决方案,但它适用于简单的场景。
答案 3 :(得分:0)
您可以创建自己的方法,调用类似于此的方法:
public string ExpressionToString(int parameter1, string operator, int parameter2) {
return string.Format("{0} {1} {2}", parameter1, operator, parameter2);
}
答案 4 :(得分:0)
请使用创建您的方法并使用下面的代码来满足您的要求
string answer = string.Format("{0} {1} {2} = {3}", iTwo, iTwo, operator, result);
答案 5 :(得分: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();
}
答案 6 :(得分:0)
public static string ExpressionToString(params object[] param)
{
return string.Join(" ", param.Select(t => t.ToString()).ToArray());
}
使用:
string result = Helper.ExpressionToString(2, "*", 2 , ">=", -10);
//result = "2 * 2 >= -10";