【awesome-dotnet-core-learning】(2)-Sprache.Calc-表达式计算器
【awesome-dotnet-core-learning】(2)-Sprache.Calc-表达式计算器
示例代码托管在GITHUB上, 欢迎STAR!
严格来说, Sprache.Calc只是上一篇Sprache-解析器构建库中介绍的Sprache的一个扩展库,而且未罗列在awesome-dotnet-core中.但是表达式计算在很多应用中都有需求,所以单独写一篇博客介绍它.
简介
Sprache.Calc提供了简单易用的表达式计算器功能.可将输入的字符串做为一个表达式,转换成结构化的LINQ表达式,并且可被编译为可执行的委托.
特点
- 支持算术运算, 自定义函数和参数
- 转换为LINQ表达式
- 可编译成委托并执行
- 因为可编译成委托,所以性能上与原生C#相同
快速上手
以下示例演示了用Sprache.Calc编写一个计算表达式的程序.并演示了自定义函数和参数的使用方法.
创建一个.NET Core的命令行应用程序(详细步骤略)
使用Nuget安装Sprache.Calc:
Install-Package Sprache.Calc
在
Program.cs中,首先创建一个表达式计算器:private static readonly XtensibleCalculator Calculator = new XtensibleCalculator();
编写一个辅助方法,用于编译,执行输入的文本,并输出结果
/// <summary>
/// 运行表达式,输出计算结果
/// </summary>
/// <param name="text">文本</param>
/// <param name="parameters">参数</param>
private static void RunExpression(string text, params Expression<Func<double, double>>[] parameters)
{
var expr = Calculator.ParseExpression(text, parameters);
var func = expr.Compile();
Console.WriteLine($"{text} = {func()}");
}
首先使用XtensibleCalculator的
ParseExpression方法解析文本表达式, 该方法返回值为Expression<Func<double>>类型.所以可以使用Compile方法继承编译为Func<double>, 最后直接执行即可得到计算结果.parameters用于接收表达式中的参数.每一个都是一个Func<double, double>类型委托,如没有参数,可不传递.在
Main方法中,就可调用RunExpression了,首先我们测试基本的四则运算:// 四则运算
RunExpression("1 + 2 * 3");
RunExpression("(1 + 2) * 3");
输出结果:
1 + 2 * 3 = 7
(1 + 2) * 3 = 9
可注意到运算符的优先级和括号都是支持的.
测试自定义函数:
// 自定义函数
// 这里注册了一个名为"阶乘"的函数,用来计算一个数的阶乘
Calculator.RegisterFunction("阶乘", n =>
{
// n的阶乘 = n * (n-1) * (n-2) * ... * 1
int r = 1;
for (int i = (int) n; i > 0; i--) r *= i;
return r;
});
RunExpression("阶乘(3) + 阶乘(4)");
我们通过
RegisterFunction方法注册了一个名为"阶乘"的函数(是的自定义函数名可以为中文),然后通过Lambda函数提供了计算逻辑.这样在表达式中就可以使用我们的自定义函数了.输出结果:
阶乘(3) + 阶乘(4) = 30
测试参数
// 参数
RunExpression("阶乘(a) + 阶乘(b)", a => 4, b => 5); // 将4代入a, 5代入b
我们将表达式中的参数,通过lambda表达式赋值,这样在运行时,该参数的值就会参与计算了.
输出结果:
阶乘(a) + 阶乘(b) = 144
类似库
【awesome-dotnet-core-learning】(2)-Sprache.Calc-表达式计算器的更多相关文章
- dotNet Core开发环境搭建及简要说明
一.安装 .NET Core SDK 在 Windows 上使用 .NET Core 的最佳途径:使用Visual Studio. 免费下载地址: Visual Studio Community 20 ...
- dotnet core 使用 MongoDB 进行高性能Nosql数据库操作
好久没有写过Blog, 每天看着开源的Java社区流口水, 心里满不是滋味. 终于等到了今年六月份 dotnet core 的正式发布, 看着dotnet 社区也一步一步走向繁荣, 一片蒸蒸日上的大好 ...
- dotnet Core Asp.net 项目搭建
Asp.Net Core 介绍 Asp.Net Core 目前最新版本 1.0.0-preview2-003131 Asp.Net Core官网:https://dotnet.github.io/ A ...
- DotNet Core 介绍
前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...
- dotnet core 出现Can not find runtime target for framework '.NETCoreApp,Version=v1.6' 的解决办法
如果你在更新dotnet core新的类库后运行程序提示如下的错误: Can not find runtime target for framework '.NETCoreAPP, Version=v ...
- DotNet Core 1.0 集成 CentOS 开发与运行环境部署
一. DotNet Core 1.0 开发环境部署 操作系统安装 我们使用CentOS 7.2.1511版本. 安装libunwind库 执行:sudo yum install libunwi ...
- ubuntu15.10 或者 16.04 或者 ElementryOS 下使用 Dotnet Core
这里我们不讲安装,缺少libicu52自行安装. 安装完成后使用dotnet restore或者build都会失败,一是报编译的dll不适合当前系统,二是编译到ubuntu16.04文件夹下会产生一些 ...
- 北京时间28号0点以后Scott Hanselman同志台宣布dotnet core 1.0 rtm
今日占住微信号头条的好消息<终于来了!微软.Net Core 1.0下载放出>.本人立马跑到官网http://dot.net看了一下,仍然是.net core 1.0 Preview 1版 ...
- DotNet Core 之旅(一)
1.下载安装 DotNetCore.1.0.0-SDK.Preview2-x64.exe 下载链接:https://www.microsoft.com/net/download ps:如果有vs201 ...
- dotnet core 开发体验之Routing
开始 回顾上一篇文章:dotnet core开发体验之开始MVC 里面体验了一把mvc,然后我们知道了aspnet mvc是靠Routing来驱动起来的,所以感觉需要研究一下Routing是什么鬼. ...
随机推荐
- Spark大数据针对性问题。
1.海量日志数据,提取出某日访问百度次数最多的那个IP. 解决方案:首先是将这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中.注意到IP是32位的,最多有个2^32个IP.同样可以采 ...
- 自动登录(过滤器filter的应用)
//反复实验的时候注意数据库数据的更新 //将数据存储到cookie里面 protected void doGet(HttpServletRequest request, HttpServletRes ...
- Linux - rename 批量替换两种模式
模式一: rename sub raw * 模式二: rename 's/sub/raw/g' * sub raw 这里支持一定程序的正则匹配
- ----关于grid----
HTML部分: <div class="wrapper"> <div class="one">One</div> <d ...
- jQuery三级联动
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- shell脚本学习-变量
跟着RUNOOB网站的教程学习的笔记 shell变量 shell变量的命名 定义变量时,变量名不加美元符号($,PHP语言中需要),如: name="runoob" 注意,变量名与 ...
- WPF触发器(Trigger) - DataTrigger
官方文档中对DataTrigger的介绍 Represents a trigger that applies property values or performs actions when the ...
- Socket通信的Demo
https://blog.csdn.net/shankezh/article/details/70763579
- vue中的双向绑定
概述 今天对双向绑定感兴趣了,于是去查了下相关文章,发现有用脏检查的(angular.js),有用发布者-订阅者模式的(JQuery),也有用Object.defineProperty的(vue),其 ...
- javascript History对象属性和方法
History对象 History对象包含用户(在浏览器窗口中)访问过的URL length: 返回浏览器历史列表中的URL数量(打开浏览器,访问淘宝,返回1,再访问百度,返回2) History对象 ...