gpt4 book ai didi

c# - 使用 NCalc 获取表达式中的参数

转载 作者:太空狗 更新时间:2023-10-29 18:18:18 32 4
gpt4 key购买 nike

我有一个表达式,我想解析它以获得所有使用的参数的列表。

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”。

请注意 ParameterExtractionVisitorHashSet 的使用。这是因为如果您的表达式多次包含同一个变量(例如:"[x] + [x]"),它将被添加两次。如果您想在每次使用同一个变量时都存储一个条目,请将 HashSet 替换为 List


总而言之,我对 NCalc 的经验很少,所以我对 LogicalExpressionVisitor 的重写方法的实现是猜测。当我用 expression.Accept(this) 覆盖 void Visit(ValueExpression expression) 方法时,它导致了 StackOverflowException。因此,我只是将实现留空,它似乎 可以正常工作。因此,我建议您对我的回答持非常大的保留态度。你的里程可能会有所不同,我不能说这是否适用于所有类型的表达式。

关于c# - 使用 NCalc 获取表达式中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23013542/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com