- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个表达式,我想解析它以获得所有使用的参数的列表。
For example: "X + 5 / (Y - 1)" should give me the following result: X, Y
我已经在我的项目中使用了 NCalc;那么是否可以使用 NCalc 获取表达式中使用的参数?
根据这个讨论条目 ( https://ncalc.codeplex.com/discussions/361959 ) 是的,但我不太明白答案。
最佳答案
来自此处的讨论/答案:http://ncalc.codeplex.com/discussions/360990
我已经测试和工作的实现(对于您提供的示例表达式)是实现 LogicalExpressionVisitor
并让它记录找到的参数:
class ParameterExtractionVisitor : LogicalExpressionVisitor
{
public HashSet<string> Parameters = new HashSet<string>();
public override void Visit(NCalc.Domain.Identifier function)
{
//Parameter - add to list
Parameters.Add(function.Name);
}
public override void Visit(NCalc.Domain.UnaryExpression expression)
{
expression.Expression.Accept(this);
}
public override void Visit(NCalc.Domain.BinaryExpression expression)
{
//Visit left and right
expression.LeftExpression.Accept(this);
expression.RightExpression.Accept(this);
}
public override void Visit(NCalc.Domain.TernaryExpression expression)
{
//Visit left, right and middle
expression.LeftExpression.Accept(this);
expression.RightExpression.Accept(this);
expression.MiddleExpression.Accept(this);
}
public override void Visit(Function function)
{
foreach (var expression in function.Expressions)
{
expression.Accept(this);
}
}
public override void Visit(LogicalExpression expression)
{
}
public override void Visit(ValueExpression expression)
{
}
}
然后您可以将其用作:
var expression = NCalc.Expression.Compile("2 * [x] ^ 2 + 5 * [y]", false);
ParameterExtractionVisitor visitor = new ParameterExtractionVisitor();
expression.Accept(visitor);
var extractedParameters = visitor.Parameters;
foreach (var param in extractedParameters)
Console.WriteLine(param);
这会为我输出“x”和“y”。
请注意 ParameterExtractionVisitor
中 HashSet
的使用。这是因为如果您的表达式多次包含同一个变量(例如:"[x] + [x]"
),它将被添加两次。如果您想在每次使用同一个变量时都存储一个条目,请将 HashSet
替换为 List
。
总而言之,我对 NCalc 的经验很少,所以我对 LogicalExpressionVisitor
的重写方法的实现是猜测。当我用 expression.Accept(this)
覆盖 void Visit(ValueExpression expression)
方法时,它导致了 StackOverflowException
。因此,我只是将实现留空,它似乎 可以正常工作。因此,我建议您对我的回答持非常大的保留态度。你的里程可能会有所不同,我不能说这是否适用于所有类型的表达式。
关于c# - 使用 NCalc 获取表达式中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23013542/
我们有一个使用 Ncalc 计算字符串的通用计算例程。然而,当乘法中的值足够小以至于 Ncalc 将它们视为 int 但结果对于 int 来说太大时,我们遇到了一个问题。 例子: va
我在项目中使用 NCalc。有没有办法像这样进行日期操作 #16/02/2013# - #15/02/2013# = 1 我好像出不出结果。 Expression.Evaluate(); 上述表达式的
有谁知道比 NCalc 更新的表达式求值器?上一次发布是在 2011 年,根据我所见,(非常)快速的 Google 搜索几乎没有返回任何结果。 最佳答案 我知道这是一个迟到的回复,但为了其他搜索者以及
我想提示用户输入一个数字,然后使用 NCalc 计算和求解公式 string a = Console.ReadKey().ToString(); Expression e = new Expressi
我在我的新项目中使用 Ncalc,它几乎已经具备了我需要的一切。 我几乎都说了,因为现在我需要扩展一些功能,还要添加新的功能,例如:nth root,random 等 您知道是否有人已经实现了这些功能
我在我的项目中使用 NCalc 来计算表达式。该框架包括一组已实现的功能,可以在 here 中找到。 。 我对计算数字或字符串的长度感兴趣。我可以仅使用内置函数来实现这一点吗? 最佳答案 要获取整数的
我在使用 NCalc 时遇到了问题:我正在尝试通过将表达式写入文本框来实现一种向我的程序添加表达式的方法,然后让程序使用它来对变量求和/乘法。这是一个例子: Expression expr = new
我有一个表达式,我想解析它以获得所有使用的参数的列表。 For example: "X + 5 / (Y - 1)" should give me the following result: X, Y
我正在尝试在我的应用程序中使用 nCalc,但遇到了问题,无论出于何种原因想要转换为 UInt16 并导致错误。 string evalstring = "-.503937 ^ 2"; Express
在 vb2010 而不是 c# 中创建自定义函数的等效代码是什么? Expression e = new Expression("SecretOperation(3, 6)"); e.Eval
有没有办法在 Windows Phone 8 项目上使用 Ncalc?如果没有,还有其他选择吗? 我通过 nuget 将它添加到我的项目中,但是当我尝试计算一个表达式时它抛出一个异常 A first
我是一名优秀的程序员,十分优秀!