.net中处理数学表达式
来源:互联网 发布:知乎数据挖掘就业 编辑:程序博客网 时间:2024/06/08 18:38
最近需要计算带参数的数学表达式,比如“X+Y+10+sin(Y)”之类的的公式,
原来用VC的一个计算表达式的类,挺方便的,但是在网上找.net居然没找了好久。
不过还是找到两个,一个是这个http://download.csdn.net/source/346496
上面这个用起来还是比较方便比较快
下面这个是老外写的,动态编译,可以学习,但是处理起来比较慢
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Text;
using System.Reflection;
using System.Text.RegularExpressions;
namespace ADOGuy
...{
/**//// <summary>
/// Summary description for Class1.
/// </summary>
public class Evaluator
...{
Construction#region Construction
public Evaluator(EvaluatorItem[] items)
...{
ConstructEvaluator(items);
}
public Evaluator(Type returnType, string expression, string name)
...{
EvaluatorItem[] items = ...{ new EvaluatorItem(returnType, expression, name) };
ConstructEvaluator(items);
}
public Evaluator(EvaluatorItem item)
...{
EvaluatorItem[] items = ...{ item };
ConstructEvaluator(items);
}
private void ConstructEvaluator(EvaluatorItem[] items)
...{
ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");
cp.ReferencedAssemblies.Add("system.data.dll");
cp.ReferencedAssemblies.Add("system.xml.dll");
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
StringBuilder code = new StringBuilder();
code.Append("using System; ");
code.Append("using System.Data; ");
code.Append("using System.Data.SqlClient; ");
code.Append("using System.Data.OleDb; ");
code.Append("using System.Xml; ");
code.Append("namespace ADOGuy { ");
code.Append(" public class _Evaluator { ");
foreach (EvaluatorItem item in items)
...{
code.AppendFormat(" public {0} {1}() ",
item.ReturnType.Name,
item.Name);
code.Append("{ ");
code.AppendFormat(" return ({0}); ", item.Expression);
code.Append("} ");
}
code.Append("} }");
CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());
if (cr.Errors.HasErrors)
...{
StringBuilder error = new StringBuilder();
error.Append("Error Compiling Expression: ");
foreach (CompilerError err in cr.Errors)
...{
error.AppendFormat("{0} ", err.ErrorText);
}
throw new Exception("Error Compiling Expression: " + error.ToString());
}
Assembly a = cr.CompiledAssembly;
_Compiled = a.CreateInstance("ADOGuy._Evaluator");
}
#endregion
Public Members#region Public Members
public int EvaluateInt(string name)
...{
return (int)Evaluate(name);
}
public string EvaluateString(string name)
...{
return (string)Evaluate(name);
}
public bool EvaluateBool(string name)
...{
return (bool)Evaluate(name);
}
public object Evaluate(string name)
...{
MethodInfo mi = _Compiled.GetType().GetMethod(name);
return mi.Invoke(_Compiled, null);
}
#endregion
Static Members#region Static Members
static public int EvaluateToInteger(string code)
...{
Evaluator eval = new Evaluator(typeof(int), code, staticMethodName);
return (int)eval.Evaluate(staticMethodName);
}
static public string EvaluateToString(string code)
...{
Evaluator eval = new Evaluator(typeof(string), code, staticMethodName);
return (string)eval.Evaluate(staticMethodName);
}
static public bool EvaluateToBool(string code)
...{
Evaluator eval = new Evaluator(typeof(bool), code, staticMethodName);
return (bool)eval.Evaluate(staticMethodName);
}
static public object EvaluateToObject(string code)
...{
Evaluator eval = new Evaluator(typeof(object), code, staticMethodName);
return eval.Evaluate(staticMethodName);
}
#endregion
Private#region Private
const string staticMethodName = "__foo";
Type _CompiledType = null;
object _Compiled = null;
#endregion
}
public class EvaluatorItem
...{
public EvaluatorItem(Type returnType, string expression, string name)
...{
ReturnType = returnType;
Expression = expression;
Name = name;
}
public Type ReturnType;
public string Name;
public string Expression;
}
}
/**////
static int Compute(string expression, params int[] n)
...{
foreach (int i in n)
expression = Regex.Replace(expression, @"(?'a'.*?)(?!d)w+(?'b'.*)", "${a}" + i + "${b}");
ADOGuy.Evaluator calculator = new ADOGuy.Evaluator(typeof(int), expression, "EvaluateInt");
return calculator.EvaluateInt("EvaluateInt");
}
int L = 5;
int N = 10;
int SUM = Compute("L + N + 10", L, N);
Console.WriteLine(SUM);
Console.Read();
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Text;
using System.Reflection;
using System.Text.RegularExpressions;
namespace ADOGuy
...{
/**//// <summary>
/// Summary description for Class1.
/// </summary>
public class Evaluator
...{
Construction#region Construction
public Evaluator(EvaluatorItem[] items)
...{
ConstructEvaluator(items);
}
public Evaluator(Type returnType, string expression, string name)
...{
EvaluatorItem[] items = ...{ new EvaluatorItem(returnType, expression, name) };
ConstructEvaluator(items);
}
public Evaluator(EvaluatorItem item)
...{
EvaluatorItem[] items = ...{ item };
ConstructEvaluator(items);
}
private void ConstructEvaluator(EvaluatorItem[] items)
...{
ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");
cp.ReferencedAssemblies.Add("system.data.dll");
cp.ReferencedAssemblies.Add("system.xml.dll");
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
StringBuilder code = new StringBuilder();
code.Append("using System; ");
code.Append("using System.Data; ");
code.Append("using System.Data.SqlClient; ");
code.Append("using System.Data.OleDb; ");
code.Append("using System.Xml; ");
code.Append("namespace ADOGuy { ");
code.Append(" public class _Evaluator { ");
foreach (EvaluatorItem item in items)
...{
code.AppendFormat(" public {0} {1}() ",
item.ReturnType.Name,
item.Name);
code.Append("{ ");
code.AppendFormat(" return ({0}); ", item.Expression);
code.Append("} ");
}
code.Append("} }");
CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());
if (cr.Errors.HasErrors)
...{
StringBuilder error = new StringBuilder();
error.Append("Error Compiling Expression: ");
foreach (CompilerError err in cr.Errors)
...{
error.AppendFormat("{0} ", err.ErrorText);
}
throw new Exception("Error Compiling Expression: " + error.ToString());
}
Assembly a = cr.CompiledAssembly;
_Compiled = a.CreateInstance("ADOGuy._Evaluator");
}
#endregion
Public Members#region Public Members
public int EvaluateInt(string name)
...{
return (int)Evaluate(name);
}
public string EvaluateString(string name)
...{
return (string)Evaluate(name);
}
public bool EvaluateBool(string name)
...{
return (bool)Evaluate(name);
}
public object Evaluate(string name)
...{
MethodInfo mi = _Compiled.GetType().GetMethod(name);
return mi.Invoke(_Compiled, null);
}
#endregion
Static Members#region Static Members
static public int EvaluateToInteger(string code)
...{
Evaluator eval = new Evaluator(typeof(int), code, staticMethodName);
return (int)eval.Evaluate(staticMethodName);
}
static public string EvaluateToString(string code)
...{
Evaluator eval = new Evaluator(typeof(string), code, staticMethodName);
return (string)eval.Evaluate(staticMethodName);
}
static public bool EvaluateToBool(string code)
...{
Evaluator eval = new Evaluator(typeof(bool), code, staticMethodName);
return (bool)eval.Evaluate(staticMethodName);
}
static public object EvaluateToObject(string code)
...{
Evaluator eval = new Evaluator(typeof(object), code, staticMethodName);
return eval.Evaluate(staticMethodName);
}
#endregion
Private#region Private
const string staticMethodName = "__foo";
Type _CompiledType = null;
object _Compiled = null;
#endregion
}
public class EvaluatorItem
...{
public EvaluatorItem(Type returnType, string expression, string name)
...{
ReturnType = returnType;
Expression = expression;
Name = name;
}
public Type ReturnType;
public string Name;
public string Expression;
}
}
/**////
static int Compute(string expression, params int[] n)
...{
foreach (int i in n)
expression = Regex.Replace(expression, @"(?'a'.*?)(?!d)w+(?'b'.*)", "${a}" + i + "${b}");
ADOGuy.Evaluator calculator = new ADOGuy.Evaluator(typeof(int), expression, "EvaluateInt");
return calculator.EvaluateInt("EvaluateInt");
}
int L = 5;
int N = 10;
int SUM = Compute("L + N + 10", L, N);
Console.WriteLine(SUM);
Console.Read();
- .net中处理数学表达式
- 数学表达式处理类Calculator
- C# 数学表达式处理计算帮助类
- .Net中正则表达式
- shell中数学表达式执行不成功
- 数学运算表达式形式的验证码 C# Asp.Net
- asp.net字符串的数学表达式计算结果
- asp.net数学运算表达式形式的验证码
- 数学运算表达式形式的验证码 C# Asp.Net
- .NET中多线程处理
- .Net正则表达式处理类图
- .net中使用正则表达式
- 如何在C#中运行数学表达式字符串
- .net 中邮件收发处理
- 【c#】.NET中验证处理
- 在字符串处理中正则表达式中特殊字符处理
- 【OpenCV图像处理】十九、数学形态学方法(中)
- OC中常用的数学函数以及浮点处理函数
- explorer被杀掉又会重启的问题
- label
- 【住院记】--那麻木中的一刀:一、前记之3. 社区医院
- 涅磐还是沉沦?——点评户外媒介
- Gmail邮箱登陆问题解决方案
- .net中处理数学表达式
- 【住院记】--那麻木中的一刀:一、前记之4. 医疗保险
- 一句让我觉得很有道理的话
- (转)ROR框架介绍
- 我要怎么才能添加我的公告呢?_已经解决了!
- 打印页面设置
- 防止GET,Post注入和防止服务器攻击,并记录IP
- 怎么防止网页的内容被别人采集,非法的访问你的网站
- 如何才算掌握Java(J2SE篇)