惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Spread Privacy
Spread Privacy
H
Hacker News: Front Page
PCI Perspectives
PCI Perspectives
Webroot Blog
Webroot Blog
罗磊的独立博客
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Last Week in AI
Last Week in AI
美团技术团队
Help Net Security
Help Net Security
The Hacker News
The Hacker News
C
Cisco Blogs
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
The Register - Security
The Register - Security
IT之家
IT之家
WordPress大学
WordPress大学
Jina AI
Jina AI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Help Net Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
NISL@THU
NISL@THU
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
Scott Helme
Scott Helme
V
Vulnerabilities – Threatpost
B
Blog
T
Tenable Blog
博客园 - 三生石上(FineUI控件)
T
The Exploit Database - CXSecurity.com
S
Security Affairs
小众软件
小众软件
Hacker News: Ask HN
Hacker News: Ask HN
Security Latest
Security Latest
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
W
WeLiveSecurity
A
Arctic Wolf
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence

博客园 - WEBBER

SQL语句中使用变量作为条件。遇到NULL时怎么写 checkbox单选 T4MVC Documentation page(转) ASIHTTPRequest 详解, http 请求终结者 (转) ASP.NET版Memcached监控工具(转) 完整的DataTable和list转换 老外写的(转) 技巧:使用User Control做HTML生成(转) Silverlight跟ASP.NET之間要如何溝通querystring(转) asp.net取得Silverlight中的值(转) IIS6 Silverlight部署經驗(转) 一行内文本超出指定宽度溢出的处理 sql2005数据同步技术(数据订阅,发布)转 C# 域用户操作(转) 看到了一些面试题,发给大家,看看多少人能都全回答上来 Membership角色与权限管理 (转) 我的跳槽求职经验谈(转) IHttpHandler的妙用(2):防盗链!我的资源只有我的用户才能下载 (转) JavaScript组件之JQuery(A~Z)教程(基于Asp.net运行环境)(转) 说说大型高并发高负载网站的系统架构 (转)
c#四种eval方法(转) - WEBBER - 博客园
WEBBER · 2009-09-25 · via 博客园 - WEBBER

转自:http://blog.163.com/redtomato/blog/static/48648149200831202846410/
      有时候需要表达式运算,如

String strExpression="-12 * ( - 2.2 + 7.7 ) - 44 * 2";

网上找的,一般是利用CodeDom,见

http://www.codeproject.com/csharp/runtime_eval.asp

简化为:

System.CodeDom.Compiler.ICodeCompiler comp = (new Microsoft.CSharp.CSharpCodeProvider().CreateCompiler());

System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters();

object qswhEval2(string Expression){

StringBuilder code = new StringBuilder();

code.Append("using System; \n");

code.Append("namespace ADOGuy { \n");

code.Append(" public class _Evaluator { \n");

code.Append(" public object __foo() ");

code.Append("{ ");

code.AppendFormat(" return ({0}); ", Expression);

code.Append("}\n");

code.Append("} }");

System.CodeDom.Compiler.CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());

System.Reflection.Assembly a = cr.CompiledAssembly;

object _Compiled = a.CreateInstance("ADOGuy._Evaluator");

System.Reflection.MethodInfo mi = _Compiled.GetType().GetMethod("__foo");

return mi.Invoke(_Compiled, null);

}

但用起来感觉很慢,毕竟需要实时编译。

于是,就自己照数据结构书上写了一种算法:

string Precede(string p, string q){

switch(p){

case "+":

case "-":return ("*/(".IndexOf(q)!=-1)?"<":">";

case "*":

case "/":return (q=="(")?"<":">";

case "(":return (q==")")?"=":"<";

case ")":return (q=="(")?"?":">";

case "#":return (q=="#")?"=":"<";

}

return "?";

}

Double Operate(Double a,char o,Double b)

{

switch(o)

{

case '+':return a+b;

case '-':return a-b;

case '*':return a*b;

case '/':return a/b;

}

return 0;

}

Object qswhEval1(string Expression){

/*************(qiushuiwuhen 2002-12-14)****************/

Stack nArr=new Stack(),oArr=new Stack();

int j=0;

Double a=0,b=0;

string w="";

char o;

MatchCollection arr=Regex.Matches(Expression.Replace(" ","")+"#",@"(((?<=(^|\())-)?\d+(\.\d+)?|\D)");

oArr.Push('#');

w=Convert.ToString(arr[j++]);

while(!(w=="#"&&Convert.ToString(oArr.Peek())=="#")){

if("+-*/()#".IndexOf(w)!=-1){

switch(Precede(oArr.Peek().ToString(),w)){

case "<":

oArr.Push(w);

w=Convert.ToString(arr[j++]);

break;

case "=":

oArr.Pop();

w=Convert.ToString(arr[j++]);

break;

case ">":

o=Convert.ToChar(oArr.Pop());

b=Convert.ToDouble(nArr.Pop());

a=Convert.ToDouble(nArr.Pop());

nArr.Push(Operate(a,o,b));

break;

default:

return "Error";

break;

}

}else{

nArr.Push(w);

w=Convert.ToString(arr[j++]);

}

}

return nArr.Pop();

}

还有利用JScript的Eval的两种算法

Microsoft.JScript.Vsa.VsaEngine ve=Microsoft.JScript.Vsa.VsaEngine.CreateEngine();

object qswhEval3(string Expression){

return Microsoft.JScript.Eval.JScriptEvaluate(Expression,ve);

}

object qswhEval4(string Expression){

return qswhJs.qswhEval.Eval(Expression);

}

第四种需先建立一js编译为dll,如下代码

import System;

package qswhJs {

class qswhEval {

static function Eval(Expression):Object { return eval(Expression); }

}

}

测试代码如下:

void Page_Load(Object o,EventArgs ea){

String strExpression="-12 * ( - 2.2 + 7.7 ) - 44 * 2";

int i=0,c=100;

DateTime d1,d2;

cp.GenerateExecutable = false;

cp.GenerateInMemory = true;

d1=DateTime.Now;

for(i=0;i d2=DateTime.Now;

Response.Write("方法一:对表达式分析 "+d2.Subtract(d1)+"

");

d1=DateTime.Now;

for(i=0;i d2=DateTime.Now;

Response.Write("方法二:利用CodeCom "+d2.Subtract(d1)+"

");

d1=DateTime.Now;

for(i=0;i d2=DateTime.Now;

Response.Write("方法三:利用Jscript+Vsa "+d2.Subtract(d1)+"

");

d1=DateTime.Now;

for(i=0;i d2=DateTime.Now;

Response.Write("方法四:利用Jsc+Dll "+d2.Subtract(d1)+"

");

}

测试结果:

方法一:对表达式分析 00:00:00.1702448

方法二:利用CodeCom 00:00:23.7942144

方法三:利用Jscript+Vsa 00:00:00.1902736

方法四:利用Jsc+Dll 00:00:00.2403456

在此推荐第一种(如果要纯CSharp的话)

和第三种(代码简单,功能更多)