【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是什么鬼. ...
随机推荐
- 使用手势对UIImageView进行缩放、旋转和移动
// 添加所有的手势 - (void) addGestureRecognizerToView:(UIView *)view { // 旋转手势 UIRotationGestureRecognizer ...
- python04 列表 元祖 字典
1.list 有序,元素可以被修改 li=[1,2,2,"am","123"] 列表中的元素可以是数字,字符串,列表等等 支持切片,切片结果为列表 li[3] ...
- boost asio 学习(七) 网络基础 连接器和接收器(TCP示例)
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=8 7. Net ...
- centos6.9 编译安装 zabbix-3.0.15
本文采用编译安装,请在zabbix官网下载所需版本.此处安装版本是:zabbix-3.0.15.tar.gz 操作系统:centos 6.9 一.安装mysqlmysql-community-libs ...
- 1.6Eigen中系数运算Reductions, visitors and broadcasting
Eigen::Matrix2d mat; mat<<,, ,; cout<<"矩阵所有系数之和:"<<mat.sum();//1+2+3+4=1 ...
- apache、nginx、tomcat配置方法
https://www.cnblogs.com/chenmh/p/5121830.html
- Codeforces Round #539--1113B - Sasha and Magnetic Machines
https://codeforces.com/contest/1113/problem/B 思想不难,但是在比较大小的时候,我选择了很笨的方法,我用两个数变化之后的差值大小来进行选择,然后最后再进行数 ...
- 关于HttpClient,HttpURLConnection,OkHttp的用法
1 HttpClient入门实例 1.1发送get请求 /** * HttpClient发送get请求 * @param url 请求地址 * @return * @throws IOExceptio ...
- web安全基础
web安全备忘 主机系统安全防护:防火墙控制 Web是一个分布式系统,一个站点多个主机布置,一主机布置多个站点:并发,异步,同步 主机安全配置文件修改与强化 web站点数据验证逻辑的常用技巧:功能性代 ...
- 16.IO之其他流
第一 打印流 一.概述: 该流提供了打印方法,可以将各种数据类型的数据都原样打印 原理; x<=3; x++){ al.add(new FileInputStream(x+".txt ...