Существует ярлык для ограниченных (т. Е. Простых) математических выражений с использованием метода DataTable.Compute . Очевидно, что это не надежно (ограниченная функциональность) и кажется хакерским, чтобы неправильно использовать DataTable для этой цели, но я решил добавить к текущим ответам.
Пример:
var result = new DataTable().Compute("3+(7/3.5)", null); // 5
«Грех (90)» не будет работать с этим подходом. Обратитесь к странице DataColumn.Expression Property для получения списка поддерживаемых функций, в частности, в разделе «Агрегаты».
Использование пространства имен 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 или другие могут быть более подходящими.