Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将表达式的值打印为字符串_C#_.net - Fatal编程技术网

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