C#实现将字符串作为表达式运算
转载:http://blog.csdn.net/lifeforcode/article/details/2010807
曾经有个需求,要把一段字符串作为C#的一段语句来执行。说实在了,就类似实现计算器的功能,把用户输入的数据作为运算式来执行,当时的需求当然不这么简单,不过在解决思路上没 区别。
队友们提出了几个方案,第一个方案是强技术型的:把这个字符串解析成波兰式,再把这个波兰式压入队列中逐步处理。第二个方案是强工具型的:利用数据库的运算功能,把这个字符串组成Sql交给数据库运算。最后我报个折中的想法:依旧要利用编程语言实现,不过要利用内建类库。
一开始看到上面需求,熟悉JavaScript的朋友就会想到Eval这个强大的方法了。当时我是也如此想,可是有大量的逻辑处理要在伺服端运行,最后的思路就是想办法让C#实现Eval方法。当时找到了几种方法,最后使用了下面
一种:
private object EvalExpress(string sExpression)
{
Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
return Microsoft.JScript.Eval.JScriptEvaluate(sExpression, ve);
}
EvalExpress这个方法便可以将sExpression作为表达式执行,运行结果返回是object,但是根据参数内容不同,可以转换成bool、int、string等。
不过既然是使用脚本引擎来执行的,速度不会太好。而且这两个组件在VS05中提示已过时,但是在提示信息和MSDN中没找到替代方案。
另外还有两种方法:引用Com组件来使用脚本引擎和引用CodeDom动态编译,不过这两种性能比用.Net组件还低些,具体实现方法待找到当时的测试用例再补上。
C#实现将字符串作为表达式运算的更多相关文章
- java字符串类型数学运算表达式以及精度丢失问题
字符串类型数学运算精度丢失问题 方式一:ScriptEngine 会精度丢失,可执行连续双括号 方式二:hutool ScriptUtil 会精度丢失,可执行连续双括号 方式三:hutool Scri ...
- 【转】C# 将字符串或表达式直接转为可执行代码的办法
C# 将字符串或表达式直接转为可执行代码的办法 反射类 using System; using System.Data; using System.Configuration; using Syste ...
- 2178 表达式运算Cuties
2178 表达式运算Cuties 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 大师 Master 题解 题目描述 Description 给出一个表达式,其中运算 ...
- C# 字符串计算表达式
C# 字符串计算表达式 string str="4+4+2.1"; 要的效果: double sum=4+4+2.1: 方案一: 动态计算表达式: 1 public class ...
- JavaScript快速入门(五)——表达式运算
赋值运算 赋值运算的形式为左值 = 右值.如果同个表达式中有多个赋值运算,则从右到左运算.例如: a = b = c; // 和下面两行等价 b = c; a = b; 另外一种赋值运算的形式叫做复合 ...
- codevs2178 表达式运算Cuties[笛卡尔树]
2178 表达式运算Cuties 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 给出一个表达 ...
- 算法笔试题整理——升级蓄水池 && 字符串数字表达式计算值 && 求旅游完所有景点需要的最少天数 && 宝箱怪
1. 小米笔试题——升级蓄水池 题目描述: 在米兔生活的二维世界中,建造蓄水池非常简单. 一个蓄水池可以用n个坐标轴上的非负整数表示,代表区间为[0-n]范围内宽度为1的墙壁的高度. 如下图1,黑色部 ...
- 6. python 字符串格式化表达式
6. python 字符串格式化表达式 字符串格式化允许在一个单个的步骤中对一个字符串执行多个特定类型的替换 特别是给用户提示的时候,格式化非常方便 实现方法: 1.格式化表达式,类似于c语言的pri ...
- 【阿里云IoT+YF3300】7.物联网设备表达式运算
很多时候从设备采集的数据并不能直接使用,还需要进行处理一下.如果采用脚本处理,有点太复杂了,而采用表达式运算,则很方便地解决了此类问题. 一. 设备连接 运行环境搭建:Win7系统请下载相关的设备驱 ...
随机推荐
- iOS源文件工程打包
第一步:添加开发者账号 第二步:刷新 第三步:设置证书名 第四步:Export
- python venv actieve uninstall pack-name sitepage
- Maven父工程
1.创建Maven工程时 Packaging 选项为 pom 2.父工程目录结构只有pom.xml(父工程不进行编码) 3.需要的依赖信息在父工程中定义,子模块继承 5.将各个子模块聚合到一起 6.将 ...
- jar 问题 : java.io.IOException: invalid header field
通过本文, 我们明白了什么是 jar的清单文件 MANIFEST.MF, 简单示例: E:\ws\Test\WEB-INF\classes>jar cvfm testCL.jar ListTes ...
- redis导数到mysql
filename=$(date "+%Y%m%d%H%M%S") //将type为list,键为bi0205导出文本,并保存到mysql导入导出目录redis-cli -h 服务器 ...
- spark sql 中的结构化数据
1. 连接mysql 首先需要把mysql-connector-java-5.1.39.jar 拷贝到 spark 的jars目录里面: scala> import org.apache.spa ...
- 白鹭引擎 - 本地坐标和舞台坐标的转化 ( globalToLocal, localToGlobal )
class Main extends egret.DisplayObjectContainer { /** * Main 类构造器, 初始化的时候自动执行, ( 子类的构造函数必须调用父类的构造函数 ...
- hasattr getattr setattr delattr --> (反射)
class Room: def __init__(self,name): self.name = name def big_room(self): print('bigroot') R = Room( ...
- web API的概念
11月20日 纷乱的术语 接口:从接口测试说起,接口是某个对象和外界交互的部分,应用程序可能有很多接口. 用户界面UI(user interface) 消息交互接口,外界是其他程序:diameter, ...
- SonarQube与Jenkins结合提高代码质量
首先,为什么需要SonarQube? 1.WriteClean Code 1)全局健康报告 2)关注新增的问题 3)强制QualityGate 4)Issue详情及建议- 详情参考:https:/ ...