【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是什么鬼. ...
随机推荐
- 三次样条插值算法C++实现
三次样条插值算法 1 总体说明 三次样条插值算法是一种计算量和效果都比较理想的插值算法.关于三次样条插值算法的原理这里不做过多的解释,下面的代码是我在网上收集了两种C++实现版本的基础上自己整合的一个 ...
- Heartbleed心脏出血漏洞原理分析
Heartbleed心脏出血漏洞原理分析 2017年01月14日 18:14:25 阅读数:2718 1. 概述 OpenSSL在实现TLS和DTLS的心跳处理逻辑时,存在编码缺陷.OpenSS ...
- django by example 第四章 dashboard处html无法渲染问题
描述: 实现django by example 代码时,第四章 dashboard处html无法渲染问题. 此时报错,NoReverseMatch at /account/login/, Error ...
- 20175316盛茂淞 迭代和JDB
迭代和JDB 题目 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能 2 m,n 要通过命令行传入 3 提交测试运行截图(至少三张:正常如c( ...
- Paper | Residual learning
目录 1. OVERVIEW 2. DEGRADATION 3. SOLUTION(DEEP RESIDUAL LEARNING) 4. IMPLEMENTATION(SHORTCUT CONNECT ...
- noip第16课资料
- 深度搜索优先(全排列)//本内容来自《啊哈!算法》或者英文名《Aha!Algorithms》)
package Mypackage; import java.util.Scanner; public class 全排列{ static int a[]=new int[10]; static ...
- 带权单源最短路[稀疏图](Dijkstra)
因为是稀疏图,所以应当选择邻接表来存储 构造一个邻接表 这只是我的构造方法,有很多种更好的构造方法,大家可以自己去构造 typedef int vertex; typedef int WeightTy ...
- day_2安装Python解释器和pycharm
首先我们复习一下昨天的内容 ···重点 1:进制转换:二进制 与 十六进制 1111 0101 1010 转换为 f5a 2:内存分布:堆区 和 栈区 计算机的原理: 控制器 运算器 存储器 inp ...
- 重新编译安装swoole支持OpenSSL
1.下载:wget http://pecl.php.net/get/swoole-1.9.22.tgz 2.解压:tar zxvf swoole-1.9.22.tgz 3.扩展模块:cd swoole ...