【C#.NET解説】文字列の計算式を数値に変換して値を出すNCalcの使い方

2025年4月21日月曜日

計算

t f B! P L

名前空間 NCalc

自己紹介

余は真理を重んじ、誠を貫く者なり。道を正し、理を解く力を民に授けるを誓おう。
本日は、C#.NETにて複雑な数式の評価を可能にする「NCalc」について、その力と使い道を余が直々に説こうぞ。
心して聞くがよい。

基本機能

「NCalc」とは、C#において文字列として記述された数式を解析し、実行して結果を得るためのNugetで取得できるライブラリである。
四則演算、論理演算、関数などを含む複雑な式も扱えるのが大きな特徴じゃ。

C#

using NCalc;

// 基本的な四則演算の評価
Expression exrp = new Expression("3 + 5 * 2");
Console.WriteLine(exrp.Evaluate()); // 出力: 13

上記の例では、文字列の数式 "3 + 5 * 2" が正しく評価され、計算結果が得られる。これにより、コード中で柔軟な数式処理が可能となるのだ。

よく使う場面と注意点

NCalcは、ユーザーが入力する式を評価したい場合や、設定ファイルなどで柔軟な条件式を記述したい場面にて真価を発揮する。
しかし、式が不正である場合は例外を発生させるゆえ、try-catchでの例外処理を忘れるでないぞ。

C#

try
{
    Expression exrp = new Expression("10 / 0"); // ゼロ除算
    Console.WriteLine(exrp.Evaluate());
}
catch (Exception ex)
{
    Console.WriteLine("エラー発生: " + ex.Message);
}

このように、誤りに対して備えを怠らぬことが、真の武人の心構えじゃ。

式評価とカスタム関数の活用術

NCalcでは自らの関数を定義し、式に組み込むことが可能となる。この応用力により、汝の想像を超えた柔軟性が得られよう。

C#

// 式を定義
Expression expr = new Expression("Double(4)");

// カスタム関数の定義
expr.EvaluateFunction += (name, args) =>
{
    if (name == "Double")
    {
        // 引数の取得と計算
        int input = Convert.ToInt32(args.Parameters[0].Evaluate());
        args.Result = input * 2; // 2倍
    }
};

// 式を評価して結果を表示
Console.WriteLine(expr.Evaluate()); // 出力: 8


Console.WriteLine(e.Evaluate()); // 出力: 8

このように、自らの手で「Double」という関数を加えることにより、式評価の幅が一気に広がる。まさに兵法に通ずる工夫といえよう。

具体的な使い方

変数を使って式を動的に評価することも、NCalcの得意とするところじゃ。以下に例を示す。

C#

Expression exrp = new Expression("a * b + c");

exrp.Parameters["a"] = 4;
exrp.Parameters["b"] = 5;
exrp.Parameters["c"] = 2;

Console.WriteLine(exrp.Evaluate()); // 出力: 22


このように、パラメータに変数を渡すことで、再利用性の高い式評価が可能となる。戦術と同じく、柔軟さが勝利を導くのだ。

その他の便利な機能やメソッド紹介

最後に、余が薦めるNCalcの技の数々を紹介しよう。

C#

// 条件式
Expression cond = new Expression("3 > 2");
Console.WriteLine(cond.Evaluate()); // 出力: True

// 論理演算
Expression logic = new Expression("true && false");
Console.WriteLine(logic.Evaluate()); // 出力: False

// 数学関数
Expression sqrt = new Expression("Pow(3, 2) + Sqrt(16)");
Console.WriteLine(sqrt.Evaluate()); // 出力: 9 + 4 = 13

// 複雑なネスト式
Expression complex = new Expression("(2 + 3) * (4 + 1)");
Console.WriteLine(complex.Evaluate()); // 出力: 25

// 関数の上書き(EvaluateFunctionで定義)
Expression custom = new Expression("Max(10, 20)");
custom.EvaluateFunction += (name, args) =>
{
    if (name == "Max")
    {
        var a = Convert.ToDouble(args.Parameters[0].Evaluate());
        var b = Convert.ToDouble(args.Parameters[1].Evaluate());
        args.Result = a > b ? a : b;
    }
};
Console.WriteLine(custom.Evaluate()); // 出力: 20

以上が、NCalcの技法の一端である。理を学ぶ者は、使いどころを見極め、真に役立てることが肝要である。
汝が真理を求め、智慧をもって道を切り開かんことを余は願っておる。

このブログを検索

QooQ