C#中关于表达式的构建示例,备忘

中的计算表达式提供一种用于编写计算的便捷语法,可以通过使用控制流构造和绑定对这些计算进行排序和组合。 根据计算表达式的类型,可以将其视为表示 monad、monoids、monad 转换器和 applicative functor 的一种方式。 但是,与其他语言(例如 Haskell 中的 do-notation)不同,它们不依赖于单一抽象,也不依赖宏或其他形式的元编程来实现上下文相关的便捷语法。

一下是C# 中的一个简单示例,用于计算简单表达式:

csharp 复制代码
#region Demo
public interface ISampleExpression
{
    double? Calculate(Dictionary<string, double> parameters);
}

public class ConstantExpression : ISampleExpression
{
    double _value;

    public ConstantExpression(double value)
    {
        _value = value;
    }

    public double? Calculate(Dictionary<string, double> parameters)
    {
        return _value;
    }
}

public class VarExpression : ISampleExpression
{
    string _name;

    public VarExpression(string name)
    {
        _name = name;
    }

    public double? Calculate(Dictionary<string, double> parameters)
    {
        if (parameters == null
            || !parameters.Any()
            || !parameters.ContainsKey(_name))
        {
            return default;
        }
        return parameters[_name];
    }
}

public class OperateExpression : ISampleExpression
{
    ISampleExpression _leftExp;
    ISampleExpression _rightExp;
    char _operateSymbol;

    public OperateExpression(ISampleExpression leftExp, char operateSymbol, ISampleExpression rightExp)
    {
        _leftExp = leftExp;
        _operateSymbol = operateSymbol;
        _rightExp = rightExp;
    }

    public double? Calculate(Dictionary<string, double> parameters)
    {
        var leftVal = _leftExp.Calculate(parameters);
        var rightVal = _rightExp.Calculate(parameters);
        switch (_operateSymbol)
        {
            case '+':
                return leftVal + rightVal;
            case '-':
                return leftVal - rightVal;
            case '*':
                return leftVal * rightVal;
            case '/':
                if (rightVal == 0)
                {
                    return default;
                }
                return leftVal / rightVal;
            default:
                break;
        }
        return default;
    }
}

#endregion

上面用于计算表达式的类型

以下程序使用 Expression 类根据不同的 x 和 y 值计算表达式 x * (y + 2) 。

csharp 复制代码
static void Main(string[] args)
{


    ISampleExpression e = new OperateExpression(new VarExpression("x"),
                                                    '*',
                                                    new OperateExpression(
                                                    new VarExpression("y"),
                                                    '+',
                                                    new ConstantExpression(2)
                                                    )
                                                    );
    var vars = new Dictionary<string, double>();
    vars["x"] = 3;
    vars["y"] = 5;
    Console.WriteLine(e.Calculate(vars)); // "21"
    vars["x"] = 1.5;
    vars["y"] = 9;
    Console.WriteLine(e.Calculate(vars)); // "16.5"
}
相关推荐
AI小怪兽1 分钟前
轻量、实时、高精度!MIE-YOLO:面向精准农业的多尺度杂草检测新框架 | MDPI AgriEngineering 2026
开发语言·人工智能·深度学习·yolo·无人机
码农小韩1 分钟前
基于Linux的C++学习——循环
linux·c语言·开发语言·c++·算法
CoderCodingNo11 分钟前
【GESP】C++五级/四级练习(双指针/数学) luogu-P1147 连续自然数和
开发语言·c++·算法
IT=>小脑虎12 分钟前
PHP零基础衔接进阶知识点【详解版】
开发语言·学习·php
202321336054 刘17 分钟前
Linux常用命令分类整理
linux·运维·数据库
Q741_14718 分钟前
海致星图招聘 数据库内核研发实习生 一轮笔试 总结复盘(2) 作答语言:C/C++ 哈夫曼编码 LRU
c语言·数据库·c++·算法·笔试·哈夫曼编码·哈夫曼树
你怎么知道我是队长21 分钟前
C语言---位域
c语言·开发语言
齐 飞27 分钟前
快速删除mysql表中所有数据-TRUNCATE TABLE
数据库·mysql
想摆烂的不会研究的研究生30 分钟前
每日八股——Redis(2)
数据库·redis·缓存
optimistic_chen32 分钟前
【Redis系列】主从复制
linux·数据库·redis·缓存·中间件·命令行·主从复制