`

动态计算字串表达式值的类

 
阅读更多

最近用到了这个功能,要计算一些字符串表达式,如"1 + 3 / 2"等等,就写了这个类。原理很简单,就是用CodeDom动态生成一个包含自定义函数的程序集,再通过反射调用。网上例子极多。我这个类是拿来就可以用的,只需要Copy一下代码就可以直接用,不用读代码。支持常用数学函数,如Sin,Log等,而且不区分大小写。

------------------------------------------------------------------------------------
其实大家可以使用ADO.NET中的DataTable来实现,加入一个DataColumn然后把Expression属性赋值成这个表达式,之后一个筛选返回数据就可以了,简单方便,也比这个快多了
--------------------------------------------------------------------------------------
我用sql实现过这个功能

selecttop1(1+3/2)asretfromtable_namewhere1=1


当时找不到别的办法了,自己写逆根遍历太麻烦了,就想了这个歪点子


歪点子可以更简单点,嘿嘿

select (1+3/2) as Exp1
----------------------------------------------------------------------------------------
还有更好的方法

Microsoft.JScript.Vsa.VsaEngineve=Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
objectqswhEval3(stringExpression)...{
returnMicrosoft.JScript.Eval.JScriptEvaluate(Expression,ve);
}

只需要添加Microsoft.JScript和Microsoft.Vsa两个引用就OK,超简洁....呵呵

------------------------------------------------------------------------------------------
这样做不错,但是搂住没有考虑到一个问题,每做一次计算,就会编译出来一个Assembly,并装载在当前的AppDomain,这样随着程序的不断计算,越来越多地Assembly被装载在当前AppDomain,一个Assembly一旦被装载,除非所在的AppDomain被卸载,否则。net是不能单独卸载某个Assembly,这样使用的内存会越来越多,又不能被垃圾回收
-----------------------------------------------------------------------------------------
最简单的方法:

stringexp="(5+6)*8-3/2-4+3";
DataTablemyDataTable
=newDataTable("CalcTable");
exp
=Convert.ToString(myDataTable.Compute(exp,""));


-----------------------------------------------------------------------------------------

分享到:
评论

相关推荐

    正则表达式

    由于某些字符类非常常用,所以JavaScript的正则表达式语法包含一些特殊字符和转义序列来表示这些常用的类.例如, \s 匹配的是空格符,制表符和其它空白符, \s 匹配的则是空白符之外的任何字符. 正则表灰式的字符类 ...

    aspnet公共类cs文件.rar

    正则表达式辅助类(CRegex.cs) CString 的摘要说明。(CString.cs) CText文本内容的类库(CText.cs) 初始化语言环境(CultureInfoUtil.cs) 压缩文本、字节或者文件的压缩辅助类(GZipUtil.cs) Log4Net日志记录辅助...

    DotNet公用类(超多附文档)

    4.正则表达式辅助类(CRegex.cs) 5.CString 的摘要说明。(CString.cs) 6.CText文本内容的类库(CText.cs) 7.初始化语言环境(CultureInfoUtil.cs) 8.压缩文本、字节或者文件的压缩辅助类(GZipUtil.cs) 9.Log4Net...

    Linux expr命令用法详解

    Linux expr命令 ...1、计算字串长度 > expr length “this is a test” 14 2、抓取字串 > expr substr “this is a test” 3 5 is is 3、抓取第一个字符数字串出现的位置 > expr index sarasara a

    expr命令 命令行计数器

    expr命令的英文全称是“expression”,即是表达式的意思,作用是一个命令行的计数器,...计算字串长度: [root@linuxcool ~]# expr length “this is a test” 14 抓取字串: [root@linuxcool ~]# expr substr “thi

    WHC第三方控件

    4. 正则表达式辅助类(CRegex.cs) 5. CString 的摘要说明。(CString.cs) 6. CText文本内容的类库(CText.cs) 7. 初始化语言环境(CultureInfoUtil.cs) 8. 压缩文本、字节或者文件的压缩辅助类(GZipUtil.cs) 9. ...

    【系统】数据库管理系统复习提纲.docx

    trim,ltrim,alltrim 取字串:left,right,substr 计算字串出现次数:occurs 取字串位置:at,atc 子串替换:stuff 字符替换:chartran 字符串匹配:like 日期时间函数: 系统时间:date,time,datetime 取年份、月份和天数...

    浏览器如何判断css优先级

    优先级是根据由每种选择器类型构成的级联字串计算而成的. 它不是一个对应相应匹配表达式的权重值. 如果优先级相同,元素最终会应用 CSS 中靠后的声明. 注意: 在文档树中的距离是不会对元素优先级计算产生影响的....

    SQL语法大全

    sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式" (3) 删除数据记录: sql="delete from 数据表 where 条件表达式" sql="delete from 数据表" (将数据表所有记录删除) (4) 添加...

    AE CS4 CDkey

    例如,如果写一个旋转属性的表达式就能获取旋转属性的值。 Number time 描述合成的时间, 单位是秒。 Number colorDepth 返回8或16表示的彩色深度位数值。例如, 当项目的每通道的彩色深度为16位时colorDepth 返回16...

    SuperNotepad

    03) 计算表达式 例︰2*sin(30*3.1415926/180) 支持批量表达式 计算,每个表达式请放在独立的行中 04) 执行DOS命令 例︰@echo off&setlocal; EnableDelayedExpansion&color; 0f&set; all=1&set; /A a=0&set...

    EXCEL集成工具箱V6.0

    【综合计算显示】 综合计算并显示选中区域存储格的最大值、最小值、平均值、求和、存储格个数、筛选状态下的的加总求和,以及显示选区包含的数字、字符、汉字的个数等信息。 【GB2转BIG5】 将选中区域存储格的简体...

    EXCEL集成工具箱V8.0完整增强版(精简)

    【综合计算显示】 综合计算并显示选中区域存储格的最大值、最小值、平均值、求和、存储格个数、筛选状态下的的加总求和,以及显示选区包含的数字、字符、汉字的个数等信息。 【GB2转BIG5】 将选中区域存储格的简体...

    Linux高级bash编程

    在目录的所有文件中查找源字串 10-10. 列出目录中所有的符号连接文件 10-11. 将目录中的符号连接文件名保存到一个文件中 10-12. 一个C风格的for循环 10-13. 在batch mode中使用efax 10-14. 简单的while循环 10-15. ...

    Advanced Bash-Scripting Guide <>

    在目录的所有文件中查找源字串 10-10. 列出目录中所有的符号连接文件 10-11. 将目录中的符号连接文件名保存到一个文件中 10-12. 一个C 风格的for 循环 10-13. 在batch mode 中使用efax 10-14. 简单的while 循环 10-...

Global site tag (gtag.js) - Google Analytics