【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. boost asio 网络聊天 代码修改学习

    简化asio的聊天代码 去除ROOM的设计 所有连接客户端均在同一个ROOM下 /*********************************************************** ...

  2. mysql error#1251客户端版本过低

    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; Query OK, 0 ...

  3. 利用python同步windows和linux文件

    写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,然后再利用网络copy,重复性很大,就想着能不能写一个小脚本帮我同步 逻辑:比对本地和服务器文件的 ...

  4. array_filter()函数

    用回调函数过滤数组中的值 array_filter(array,callbackfunction); 返回过滤后的数组

  5. SDWebImage之UIView+WebCache

    UIView+WebCache是我们能很方便的使用sd_setImageWithURL:系列方法来加载图片的关键类.UIButton(WebCache).MKAnnotationView(WebCac ...

  6. Python selenium + Firefox启动浏览器

    Python selenium 的运用 from selenium import webdriver # from selenium.webdriver.firefox.firefox_profile ...

  7. Javascript百学不厌 - 模块模式

    记录自己觉得重要又可能忘记的东西 用模块模式产生安全的对象: var serial_maker = function () { var preifx = ''; var seq = 0; return ...

  8. ElasticSearch权威指南学习(结构化查询)

    请求体查询 简单查询语句(lite)是一种有效的命令行adhoc查询.但是,如果你想要善用搜索,你必须使用请求体查询(request body search)API. 空查询 我们以最简单的 sear ...

  9. 第五篇: 路由网关(zuul)

    在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统. 在Spring Cloud ...

  10. Thread-方法以及wait、notify简介

    Thread.sleep()1.静态方法是定义在Thread类中.2.Thread.sleep()方法用来暂停当前执行的线程,将CPU使用权释放给线程调度器,但不释放锁(也就是说如果有synchron ...