C# 将表达式的值打印为字符串
我想得到一个数学表达式,它接受变量并打印(分配给字符串)公式,并填入变量C# 将表达式的值打印为字符串,c#,.net,C#,.net,我想得到一个数学表达式,它接受变量并打印(分配给字符串)公式,并填入变量 int iTwo = 2; int iResult = 0; iResult = iTwo * iTwo; string theString = (iTwo * iTwo).ToString(); 在上述代码中,iResult=4和字符串=“4” 我想做一些事情来填充变量并返回数学表达式,如: theString = (iTwo * iTwo).ExpressionToString(); 并以字符串=“2*
int iTwo = 2;
int iResult = 0;
iResult = iTwo * iTwo;
string theString = (iTwo * iTwo).ToString();
在上述代码中,iResult=4和字符串=“4”
我想做一些事情来填充变量并返回数学表达式,如:
theString = (iTwo * iTwo).ExpressionToString();
并以字符串=“2*2”结束
想法 您可以创建自己的方法,该方法调用类似以下内容:
public string ExpressionToString(int parameter1, string operator, int parameter2) {
return string.Format("{0} {1} {2}", parameter1, operator, parameter2);
}
请使用创建您的方法,并在其中使用以下代码来实现您的要求
string answer = string.Format("{0} {1} {2} = {3}", iTwo, iTwo, operator, result);
使用:
string result = Helper.ExpressionToString(2, "*", 2 , ">=", -10);
//result = "2 * 2 >= -10";
由于某些运算符重载
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以外的其他类型的方法,但基本思想保持不变
请注意,必须仅将第一个操作数强制转换为表达式,否则只能得到要转换的结果。可以使用
表达式类型
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)
公共静态字符串ExpressionToString(表达式e)
{
var un=e.Body作为二进制表达式;
如果(un!=null)
{
var left=un.left.ToString();
var leftEnd=left.Split('.').LastOrDefault();
var right=un.right.ToString();
var rightEnd=right.Split('.').LastOrDefault();
返回e.Body.ToString().Replace(左,左端)。Replace(右,右端);
}
返回e.Body.ToString();
}
Console.WriteLine(ExpressionToString(()=>iTwo*iTwo));
//打印(iTwo*iTwo)
您需要使该方法更加复杂,以解析比简单的二进制表达式更复杂的内容,但这是一般的想法。您可以只执行e.Body.ToString()
,但由于为lambda创建匿名类型的方式,这可能会得到不好的结果,例如:(值(TestApp.Program+c_udisplayClass3)。它包含*值(TestApp.Program+c_udis
playClass3).iTwo)
您可以使用表达式和表达式中存储的参数信息来获取所需的内容。将表达式存储在表达式
变量中
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
intn1=4;
int n2=3;
表达式exp=(arg1,arg2)=>arg1*arg2;
string expString=exp.ToString();//(arg1,arg2)=>arg1*arg2
int startRHS=expString.IndexOf(“=>”)+2;//RHS起始指数
string onlyRHS=expString.Substring(startRHS.Trim();//arg1*arg2
//用值替换args
字符串的值为onlyRHS.Replace(exp.Parameters[0].Name,n1.ToString());//4*arg2
withValues=withValues.Replace(exp.Parameters[1].Name,n2.ToString());//4 * 3
虽然这不是最健壮的解决方案,但它适用于简单的场景。到目前为止,这是一个好主意,但这里有一个复杂的问题。。。今天的表达可能是:itwo*itwo。。。但明天的表达可能是:(itwo*itwo)/另一个变量。。。我需要将任意数量的变量转换为它们的值,然后转换为字符串(保留运算符、括号等)。换句话说,我将有不同的表达式需要求值并转换为字符串。这很好,因为他可以编译表达式并执行它。
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)
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