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

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

示例代碼託管在GITHUB上, 歡迎STAR!html

嚴格來講, Sprache.Calc只是上一篇Sprache-解析器構建庫中介紹的Sprache的一個擴展庫,並且未羅列在awesome-dotnet-core中.可是表達式計算在不少應用中都有需求,因此單獨寫一篇博客介紹它.git

簡介

Sprache.Calc提供了簡單易用的表達式計算器功能.可將輸入的字符串作爲一個表達式,轉換成結構化的LINQ表達式,而且可被編譯爲可執行的委託.github

特色

  • 支持算術運算, 自定義函數和參數
  • 轉換爲LINQ表達式
  • 可編譯成委託並執行
  • 由於可編譯成委託,因此性能上與原生C#相同

快速上手

如下示例演示了用Sprache.Calc編寫一個計算表達式的程序.並演示了自定義函數和參數的使用方法.c#

  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>類型委託,如沒有參數,可不傳遞.code

  5. Main方法中,就可調用RunExpression了,首先咱們測試基本的四則運算:htm

    // 四則運算
    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

相似庫

相關文章
相關標籤/搜索