【awesome-dotnet-core-learning】(2)-Sprache.Calc-表达式计算器

示例代码托管在GITHUB上, 欢迎STAR!

严格来说, Sprache.Calc只是上一篇Sprache-解析器构建库中介绍的Sprache的一个扩展库,而且未罗列在awesome-dotnet-core中.但是表达式计算在很多应用中都有需求,所以单独写一篇博客介绍它.

简介

Sprache.Calc提供了简单易用的表达式计算器功能.可将输入的字符串做为一个表达式,转换成结构化的LINQ表达式,并且可被编译为可执行的委托.

特点

  • 支持算术运算, 自定义函数和参数
  • 转换为LINQ表达式
  • 可编译成委托并执行
  • 因为可编译成委托,所以性能上与原生C#相同

快速上手

以下示例演示了用Sprache.Calc编写一个计算表达式的程序.并演示了自定义函数和参数的使用方法.

  1. 创建一个.NET Core的命令行应用程序(详细步骤略)

  2. 使用Nuget安装Sprache.Calc:

    Install-Package Sprache.Calc
  3. Program.cs中,首先创建一个表达式计算器:

    private static readonly XtensibleCalculator Calculator = new XtensibleCalculator();
  4. 编写一个辅助方法,用于编译,执行输入的文本,并输出结果

    /// <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>类型委托,如没有参数,可不传递.

  5. Main方法中,就可调用RunExpression了,首先我们测试基本的四则运算:

    // 四则运算
    RunExpression("1 + 2 * 3");
    RunExpression("(1 + 2) * 3");

    输出结果:

    1 + 2 * 3 = 7
    (1 + 2) * 3 = 9

    可注意到运算符的优先级和括号都是支持的.

  6. 测试自定义函数:

    // 自定义函数
    // 这里注册了一个名为"阶乘"的函数,用来计算一个数的阶乘
    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
  7. 测试参数

    // 参数
    RunExpression("阶乘(a) + 阶乘(b)", a => 4, b => 5); // 将4代入a, 5代入b

    我们将表达式中的参数,通过lambda表达式赋值,这样在运行时,该参数的值就会参与计算了.

    输出结果:

    阶乘(a) + 阶乘(b) = 144

类似库

【awesome-dotnet-core-learning】(2)-Sprache.Calc-表达式计算器的更多相关文章

  1. dotNet Core开发环境搭建及简要说明

    一.安装 .NET Core SDK 在 Windows 上使用 .NET Core 的最佳途径:使用Visual Studio. 免费下载地址: Visual Studio Community 20 ...

  2. dotnet core 使用 MongoDB 进行高性能Nosql数据库操作

    好久没有写过Blog, 每天看着开源的Java社区流口水, 心里满不是滋味. 终于等到了今年六月份 dotnet core 的正式发布, 看着dotnet 社区也一步一步走向繁荣, 一片蒸蒸日上的大好 ...

  3. dotnet Core Asp.net 项目搭建

    Asp.Net Core 介绍 Asp.Net Core 目前最新版本 1.0.0-preview2-003131 Asp.Net Core官网:https://dotnet.github.io/ A ...

  4. DotNet Core 介绍

    前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...

  5. 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 ...

  6. DotNet Core 1.0 集成 CentOS 开发与运行环境部署

    一.     DotNet Core 1.0 开发环境部署 操作系统安装 我们使用CentOS 7.2.1511版本. 安装libunwind库 执行:sudo yum install libunwi ...

  7. ubuntu15.10 或者 16.04 或者 ElementryOS 下使用 Dotnet Core

    这里我们不讲安装,缺少libicu52自行安装. 安装完成后使用dotnet restore或者build都会失败,一是报编译的dll不适合当前系统,二是编译到ubuntu16.04文件夹下会产生一些 ...

  8. 北京时间28号0点以后Scott Hanselman同志台宣布dotnet core 1.0 rtm

    今日占住微信号头条的好消息<终于来了!微软.Net Core 1.0下载放出>.本人立马跑到官网http://dot.net看了一下,仍然是.net core 1.0 Preview 1版 ...

  9. DotNet Core 之旅(一)

    1.下载安装 DotNetCore.1.0.0-SDK.Preview2-x64.exe 下载链接:https://www.microsoft.com/net/download ps:如果有vs201 ...

  10. dotnet core 开发体验之Routing

    开始 回顾上一篇文章:dotnet core开发体验之开始MVC 里面体验了一把mvc,然后我们知道了aspnet mvc是靠Routing来驱动起来的,所以感觉需要研究一下Routing是什么鬼. ...

随机推荐

  1. 使用手势对UIImageView进行缩放、旋转和移动

    // 添加所有的手势 - (void) addGestureRecognizerToView:(UIView *)view { // 旋转手势 UIRotationGestureRecognizer  ...

  2. python04 列表 元祖 字典

    1.list 有序,元素可以被修改 li=[1,2,2,"am","123"] 列表中的元素可以是数字,字符串,列表等等 支持切片,切片结果为列表  li[3] ...

  3. boost asio 学习(七) 网络基础 连接器和接收器(TCP示例)

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=8 7. Net ...

  4. centos6.9 编译安装 zabbix-3.0.15

    本文采用编译安装,请在zabbix官网下载所需版本.此处安装版本是:zabbix-3.0.15.tar.gz 操作系统:centos 6.9 一.安装mysqlmysql-community-libs ...

  5. 1.6Eigen中系数运算Reductions, visitors and broadcasting

    Eigen::Matrix2d mat; mat<<,, ,; cout<<"矩阵所有系数之和:"<<mat.sum();//1+2+3+4=1 ...

  6. apache、nginx、tomcat配置方法

    https://www.cnblogs.com/chenmh/p/5121830.html

  7. Codeforces Round #539--1113B - Sasha and Magnetic Machines

    https://codeforces.com/contest/1113/problem/B 思想不难,但是在比较大小的时候,我选择了很笨的方法,我用两个数变化之后的差值大小来进行选择,然后最后再进行数 ...

  8. 关于HttpClient,HttpURLConnection,OkHttp的用法

    1 HttpClient入门实例 1.1发送get请求 /** * HttpClient发送get请求 * @param url 请求地址 * @return * @throws IOExceptio ...

  9. web安全基础

    web安全备忘 主机系统安全防护:防火墙控制 Web是一个分布式系统,一个站点多个主机布置,一主机布置多个站点:并发,异步,同步 主机安全配置文件修改与强化 web站点数据验证逻辑的常用技巧:功能性代 ...

  10. 16.IO之其他流

    第一  打印流 一.概述: 该流提供了打印方法,可以将各种数据类型的数据都原样打印 原理; x<=3; x++){ al.add(new FileInputStream(x+".txt ...