使用DataTable.Compute方法可以简化有限(即简单)的数学表达式。显然,这并不健壮(功能受限),而且滥用DataTable来实现这一目的可能会让人感到hackish,但我认为我应该补充当前答案。
示例:
var result = new DataTable().Compute("3+(7/3.5)", null); // 5
"
这种方法无法使用“Sin(90)”。请参阅DataColumn.Expression Property page以获取支持的函数列表,特别是在“聚合”部分下。
使用System.CodeDom命名空间是一种选择。
一些有用的链接:
"
编辑:为了回应您的评论,这里提供一种方法来演示使用其等效的 Math 类方法替换三角函数。
C#
string expression = "(Sin(0) + Cos(0)+Tan(0)) * 10";
string updatedExpression = Regex.Replace(expression, @"(?<func>Sin|Cos|Tan)\((?<arg>.*?)\)", match =>
match.Groups["func"].Value == "Sin" ? Math.Sin(Int32.Parse(match.Groups["arg"].Value)).ToString() :
match.Groups["func"].Value == "Cos" ? Math.Cos(Int32.Parse(match.Groups["arg"].Value)).ToString() :
Math.Tan(Int32.Parse(match.Groups["arg"].Value)).ToString()
);
var result = new DataTable().Compute(updatedExpression, null); // 10
VB.NET
Dim expression As String = "(Sin(0) + Cos(0)+Tan(0)) * 10"
Dim updatedExpression As String = Regex.Replace(expression, "(?<func>Sin|Cos|Tan)\((?<arg>.*?)\)", Function(match As Match) _
If(match.Groups("func").Value = "Sin", Math.Sin(Int32.Parse(match.Groups("arg").Value)).ToString(), _
If(match.Groups("func").Value = "Cos", Math.Cos(Int32.Parse(match.Groups("arg").Value)).ToString(), _
Math.Tan(Int32.Parse(match.Groups("arg").Value)).ToString())) _
)
Dim result = New DataTable().Compute(updatedExpression, Nothing)
请注意,您需要了解"arg"组的内容。我知道它们是整数,因此我在它们上面使用了Int32.Parse。如果它们是项的组合,则这种简单的方法将无法工作。我怀疑如果涉及到更多不支持的函数调用,则您将不断需要修补解决方案,在这种情况下,CodeDom方法或其他方法可能更适合。