C#实现将字符串作为表达式运算

编码技巧 --- 如何实现字符串运算表达式的计算 合集 - c#基础(6) 刚开始拿到这个需求还是有点头疼的,想了很久的方案,突然想到之前看数据结构的书的时候,提到过栈在表达式求值中的应用,翻书看了一下,还是被这个实现方案惊艳到了,所以,还是需要多读多看多思考,才能在面对各种需求游刃有余,加油~ 阅读详情
       曾经有个需求,要把一段字符串作为C#的一段语句来执行。说实在了,就类似实现计算器的功能,把用户输入的数据作为运算式来执行,当时的需求当然不这么简单,不过在解决思路上没 区别。
       队友们提出了几个方案,第一个方案是强技术型的:把这个字符串解析成波兰式,再把这个波兰式压入队列中逐步处理。第二个方案是强工具型的:利用数据库的运算功能,把这个字符串组成Sql交给数据库运算。最后我报个折中的想法:依旧要利用编程语言实现,不过要利用内建类库。
       一开始看到上面需求,熟悉JavaScript的朋友就会想到Eval这个强大的方法了。当时我是也如此想,可是有大量的逻辑处理要在伺服端运行,最后的思路就是想办法让C#实现Eval方法。当时找到了几种方法,最后使用了下面
一种:

使用.Net组件
/* 需将Microsoft.JScript 和Microsoft.Vsa加入参考并引用Microsoft.JScript */
public 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组件还低些,具体实现方法待找到当时的测试用例再补上。

/* 整理自 06.10.XX 技术点应用记录 */
C#通过Expression实现 字符串转表达式 自定义计算体积参数 Expression实现 字符串转表达式 自定义计算体积参数 调用方法 ExpressionVolume expressionVolume = new ExpressionVolume(); //计算表达式的值 Console.WriteLine(expressionVolume.InvokeOperator("L+10+2*W/10+H+200-800/20+L+W>=200", new ExpressionVolume.VolumeClass(10 阅读详情

相关推荐

用C#写的四则运算类(包括括号运算)

using System;using System.Collections;using System.Text;namespace ExpresstionClass{    public class ExpresstionClass    {        public string Expresstion;//String类型表达式        public ExpresstionCl

刘晓松的专栏 9034

[转]C#通过Expression实现 字符串转表达式 自定义计算体积参数

这篇文章是为了解决我工作中的一个需求而写,希望能帮到有需要的人需求的这样的:业务想让用户输入任意表达式进行计算假如成立则允许操作表达式组成:常量与特殊变量进行任意加减乘除有特殊值比较大小L+2*W<200H>50调用方法//计算表达式的值//比较表达式是否成立//验证表达式是否成立(!=-1表示成立)代码实现/// 计算体积参数#region 私有类/// 体积参数类/// 不可以去掉。

Sky的专栏 560

C#实现适字符串作为表达式运算(附完整源码)

C#实现适字符串作为表达式运算(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 173

C#中字符串转换为计算公式(自定义公式的计算)

添加COM引用:   private void button2_Click(object sender, EventArgs e)         {             MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControlClass();             sc.Language = "Jav

风林山火的专栏 4178

C#编程实践:构建中序到后序表达式计算器

本文还有配套的精品资源,点击获取 简介:实现C#编程语言中的计算器功能需要掌握数据结构、算法和逻辑处理。本项目将详细介绍如何通过中序表达式到后序表达式的转换来计算数学表达式。项目涵盖中序和后序表达式的基本概念、堆栈数据结构的应用、运算符处理规则、括号处理策略,以及如何构建和计算后序表达式。通过使用C#内置的Stack类以及字符串处理技术,本项目将这些理论知识转化为实际代码,...

weixin_42284380的博客 959

PCIe中ACS知识小记

虚拟机内部的访问数据显而易见是带的GPA地址。而目前几乎所有的PCIe 设备都带ACS control,所以它们可以单独assign给不同的VM,但是随之而来的就是即使两个GPU同时assign给同一个VM,由于ACS的存在,他们之间也不会有真正的物理层面的P2P访问。每一个TLP都自带一个address(寻址类TLP),同时每一个endpoint,PCIe switch都自带一段BIOS配置的地址空间范围,一旦这个TLP的address落入某个设备的地址范围,那么这个TLP就属于这个设备并消费。

Summer的博客 5078

c# 将字符串转换为逻辑表达式(字符串转换布尔)

比如:string str="6>5"; 要的效果是:bool result=6>5 方案一: 命名空间:System.Data; DataTable dt = new DataTable(); bool result= (bool)dt.Compute("","");dt.Compute(str, ""); 方案二: 动态表达式: 1 p...

dazhexuan0219的博客 1817

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库)

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库) 日志记录 默认情况下,所有 Sysrepo 日志记录都处于关闭状态。如果启用,日志消息有 3 种输出。它们可以写入stderr、由 处理syslog或简单地传递给回调。 请务必注意,启用 Sysrepo 日志记录也会修改libyang日志记录设置。错误消息被视为标准 Sysrepo 错误,其他严重性较低的消息完全隐藏。要更改此行为,只需在启用 Sysrepo 日志记录后调整libyang日志记录设置。 此外,几乎每个 Sysrepo

weixin_43489394的博客 9229

C#实现根据输入的代数式,计算代数式的结果_c#函数中写入了一个公式,用户界面输入相应的函数识别计算

/将运算字符串转换成表达式运算。

2501_90225620的博客 279

【Godot】构建可维护的游戏工程 —— 项目代码组织结构

本文系统梳理了Godot引擎项目组织原则与架构模式,提出场景中心化、命名规范一致性和资源隔离三大核心原则。推荐按功能模块划分目录结构(如scenes/、entities/、systems/),采用snake_case命名避免跨平台问题,并通过.gdignore优化资源管理。文章详细解析了自包含场景设计、信号驱动解耦等架构技巧,以及团队协作中的版本控制策略,强调通过模块化设计平衡一致性与实用性。最终目标构建清晰可维护的项目结构,使资源定位和功能扩展更加高效。(148字)

qq_40205510的博客 1176

使用Python开发TreeATE的测试脚本常见问题

ImportError: No module named py_compile 找不到 DevLangPython3.dll 以上2个问题都是没有安装正确的Python,当前TreeATE依赖32位Python 2.7版本,暂时不支持Python 3以上版本

蓝白云的专栏 1033

C#6 的一些新语法

people类 public class People { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } /// <summary> ///C#6新语法. :8.自动实现的属性初始化器 /// </summary> pub.

whyrookie的博客 266

全球气候模式降尺度方法总结及其代码实现

简介总结各类型气候模式降尺度方法

WW、forever的博客 1万+

Leetcode - 逆波兰表达式求值

解题思路:(C#) 通过一个栈实现,整体用一个while循环遍历整个字符串,当遇到不能把字符转换成整型时进行判断,同时将栈顶两个元素出栈进行相关运算,运算结果放入栈中继续进行遍历。 public class Solution { public int EvalRPN(string[] tokens) { Stack<int> s = new Stack<...

温馨的小窝 386

19、利用PostGIS进行空间分析:更高效的矢量分析方法

本文介绍了如何利用PostGIS进行高效灵活的矢量空间分析,重点探讨了在选址安静住宅场景中使用缓冲区和距离测量两种方法的实现与优化。通过QGIS与PostGIS结合,演示了数据上传、CTE应用、ST_Intersects与ST_Distance函数对比,并深入分析了横向子查询在提升查询性能和代码可读性方面的优势。文章还比较了不同方法的适用场景,并以房地产开发选址为例展示了完整分析流程,最后总结了PostGIS在空间分析中的强大能力与未来应用前景。

d3e4f的博客 92

agent实战专栏|日程管理Agent:智能时间管家

在快节奏的现代生活中,时间管理已成为每个人面临的核心挑战。根据全球知名调研机构 Gallup 的统计数据,现代职场人平均每天仅能有效专注工作 2 小时 23 分钟,剩余时间被会议、邮件、碎片化事务大量占据。微软的另一项研究显示,知识工作者平均每天需要处理 200 多条日程相关的信息,包括会议邀请、日历变更、提醒通知等。传统的日历工具(如 Google Calendar、Outlook Calendar、Apple Calendar)虽然在可视化展示和基础提醒方面表现出色,但在智能化方面仍存在明显短板:日程管

2201_76125393的博客 52

C#高级特性(委托拓展)

Lambda表达式的变量范围: 在定义Lambda表达式的方法内或包含Lambda表达式的类型内,Lambda表达式可以应用范围内的外部变量,将以这种方式捕获的变量进行存储以备在Lambda表达式中使用,即使在其他情况下,这些变量将超出范围并进行垃圾回收,必须明确地分配外部变量,然后从能在Lambda表达式中使用该变量。微软公司在C#中引入了委托(delegate)类型概念,通过委托可以将方法引用作为其他方法的参数进行传递,因此委托可以理解为一种托管的强类型的方法指针。

芜湖博客 365

Winform从入门到精通(38)——StatusStrip(史上最全)

本文介绍StatusStrip控件的详细用法,包含所有属性和事件,绝对史上最全!

qq_34059233的博客 2758

C# $ 字符串插值

本文介绍了C#中的字符串插值功能,重点讲解了使用$符号的实现方式。主要内容包括:1) 创建内插字符串的基本语法;2) 处理不同数据类型时的自动转换规则;3) 使用格式控制符和对其方式定制输出;4) 在内插字符串中使用转义序列和条件运算符;5) 编译器根据上下文选择string.Concat、string.Format或FormattableString三种不同实现方式。文章通过示例代码展示了各种用法,并说明了编译器在不同场景下的优化处理策略。

三叔的博客 2084

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

c#字符串中包含的运算符按正常计算 例如按四则运算等,类似公式计算,很好很强大

/// /// 将字符串中的运算符按正常计算 例如按四则运算 /// /// 标准表达式如 1+15*0.5-200 /// 返回计算的值,可以为任意合法的数据类型 protected static object MathCalculate(string expression) { object retvar = n

深南大道 3610

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

字符串表达式计算C#程序设计

字符串表达式计算C#程序设计在编程应用程序过程中,有时需要字符串表达式的值。如字符串:"23+56/(102-100)*((36-24)/(8-6))",结果=191。      根据数据结构栈的应用介绍,通过把表达式由中序式转换成后序式,再用栈来进行计算。如上述字符串表达式:"23+56/(102-100)*((36-24)/(8-6))",转换为后序时为:"23|56|102|100|-|

2161

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C#的简写技巧

在C#中,有许多简写技巧可以让你的代码更加简洁高效,以下是一些常见的: 1. 变量声明与初始化 使用 var 关键字 :当你能从初始化表达式中推断出变量类型时,可以使用 var 关键字代替显式的类型声明。例如: var name = "Kimi"; // 相当于 string name = "Kimi"; var age = 25; // 相当于 int age = 25;...

lzhdim的专栏 1067

c# 四则运算

这是一个计算四则运算的类,个人感觉比较实用,先上代码: public static class ExpresstionClass { public static string Expresstion;//String类型表达式 /// <summary> /// 判断字符串是否为数值 /// &...

weixin_30922589的博客 305

[C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性

回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性   序   目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段。C# 6.0 虽说出了一段时间,但是似乎有许多园友对这一块知识并不了解,如拼接字符串的 $ 符号,在此,小人特地献上拙作一篇《回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性》,并祝大...

weixin_34345753的博客 360

c#实现简单四则运算

Compute("1+2*3/4") static decimal Compute(string expression) { int i = 0; var r = _Compute(expression, ref i); if (i != expression.Length) throw n...

slwsss的专栏 7189
上一篇: 匿名委托之实现单件窗体
下一篇: 反射应用之GirdView多列排序
LifeForCode
博客等级 码龄21年 41粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值