.Net 中表达式的转换

如: a>0  && (c>a || a <b ) || (a>b || c>1)    转换后  (((a > 0) and ((c > a) OR (a < b))) OR ((a > b) OR (c > 1)))

本文主要用到了 表达式树(Expression Tree) , 表达式树相关知识(https://msdn.microsoft.com/zh-cn/library/system.linq.expressions.expression.aspx)

本实例 只是 抛砖引玉, 不足的地方 大家补充。

还是直接贴代码吧。

        private void button1_Click(object sender, EventArgs e)
{ //这里就先写一个吧。
Expression<Func<int, int, int, bool>> m = (a, b, c) => a > && (c > a || a < b) || (a > b || c > ); var cccc = AnalysisExpressionTree(m.Body);
MessageBox.Show("解析后的表达式:" + cccc); //再运行一下
var run = m.Compile(); var result = run(, , ); MessageBox.Show("数据转换成代码运行后的结果:" + result.ToString());
}
         /// <summary>
/// 递归解析一下 表达式树
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private string AnalysisExpressionTree(Expression m)
{
var c = m as ConstantExpression;
if (c != null)
{
return c.Value.ToString();
} var p = m as ParameterExpression; if (p != null)
{ return p.Name;
} var u = m as UnaryExpression; if (u != null)
{ if (u.NodeType == ExpressionType.Not)
{
return "!(" + AnalysisExpressionTree(u.Operand) + ")"; }
} var method = m as MethodCallExpression; if (method != null)
{
return "调用函数" + method.Method.Name + "(" + string.Join(",", method.Method.GetParameters().Select(pp => pp.Name)) + ")"; } var b = m as BinaryExpression; if (b != null)
{ switch (b.NodeType)
{
case ExpressionType.And:
return "(" + AnalysisExpressionTree(b.Left) + " and " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.AndAlso:
return "(" + AnalysisExpressionTree(b.Left) + " and " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.GreaterThan:
return "(" + AnalysisExpressionTree(b.Left) + " > " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.LessThan:
return "(" + AnalysisExpressionTree(b.Left) + " < " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.OrElse:
return "(" + AnalysisExpressionTree(b.Left) + " OR " + AnalysisExpressionTree(b.Right) + ")"; case ExpressionType.NotEqual:
return "(" + AnalysisExpressionTree(b.Left) + " != " + AnalysisExpressionTree(b.Right) + ")"; //这里还可以再加 ,此例只是一个 DEMO }
} return ""; }

OK  , 就写这些吧。 好久不写博客了。源代码  也发出来吧。

.Net 中表达式的转换的更多相关文章

  1. 中后缀表达式/洛谷P1175 表达式的转换

    P1175 表达式的转换 思路:先用栈转成中缀表达式,再用栈进行计算.要输出过程,因此计算一次输出一次,但是栈没有迭代器,不好用,换成vector(可以pop_back).虽然表达式求值也可以这么做, ...

  2. c++中的强制转换static_cast、dynamic_cast、reinterpret_cast的不同用法儿

    c++中的强制转换static_cast.dynamic_cast.reinterpret_cast的不同用法儿   虽然const_cast是用来去除变量的const限定,但是static_cast ...

  3. swust oj(0088)表达式的转换

    表达式的转换(0088) Time limit(ms): 5000 Memory limit(kb): 65535 Submission: 435 Accepted: 93 Accepted 16级卓 ...

  4. MYSQL中的日期转换

    MYSQL中的日期转换 网址: http://www.eygle.com/digest/2006/09/mysql_date_convert.html 对于每个类型拥有的值范围以及并且指定日期何时间值 ...

  5. Python与数据结构[1] -> 栈/Stack[1] -> 中缀表达式与后缀表达式的转换和计算

    中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操 ...

  6. 洛谷P1175 表达式的转换

    P1175 表达式的转换 44通过 147提交 题目提供者该用户不存在 标签云端 难度提高+/省选- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 这题有毒 抄题解棒责五十! ...

  7. JavaScript 中表达式和语句的区别

    1.语句和表达式 JavaScript中的表达式和语句是有区别的.一个表达式会产生一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数.下面的每行代码都是一个表达式: myvar3 + ...

  8. LINQ查询表达式详解(2)——查询表达式的转换

    简介 C#在执行LINQ查询表达式的时候,并不会指定其执行语义,而是将查询表达式转换为遵循查询表达式模式的方法的调用.具体而言,查询表达式将转换为以下名称的调用:Where.Select.Select ...

  9. java中数据类型的转换

    数据类型的转换,分为自动转换和强制转换. 自动转换是程序执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换 强制转换必须在代码中声明,转换顺序不受限制 自动数据类 ...

随机推荐

  1. windows安装python开发环境

    1.下载python 官网下载最新版python python-2.7.5.amd64.msi http://vdisk.weibo.com/s/Cd8pPaw56OWbR 2.下载PyCharm 官 ...

  2. ubuntu 的 apt-get update 出现404错误时,ubuntu 版本也 end of life 了的解决方案

    xmodulo.com/how-to-fix-apt-get-update-error-on-ubuntu.html 如果是依赖没找到,可以用 sudo apt-get install -f 先补齐依 ...

  3. Codeforces Round #138 (Div. 2) ACBDE

    A.Parallelepiped 题意:给一个六面体三面的面积,求12条边的长度和. 题解:因为都是整数,设边长分别为a,b,c,面积为xyz,那么可设x=a*b,y=b*c,z=c*a,简单解方程就 ...

  4. C/C++流程图生成器 C转流程图【worldsing笔记】

    此版本仅供学习,请大家支持正版软件!! AutoFlowChart v3.1软件下载: http://url.cn/OUK17C 支持导出:word.visio.图片格式.   例如:main.c # ...

  5. SQL Server Profiler参数说明

    上图依次说明为: TextDate 依赖于跟踪中捕获的事件类的文本值: ApplicationName 创建 SQL Server 连接的客户端应用程序的名称.此列由该应用程序传递的值填充,而不是由所 ...

  6. iOS 沙盒目录结构介绍

    iOS系统中,每个应用都有自己的沙盒,且应用只能访问其对应的沙盒目录下面的文件.当然,在用户授权的情况下,应用也可以访问其他目录下面的文件.比如,用户授权情况下,应用可以访问相册.通讯录.在开发中,经 ...

  7. wavecom短信猫常用AT命令

    wavecom短信猫常用AT命令 一.一般命令 1. AT+CGMI 给出模块厂商的标识. 2. AT+CGMM 获得模块标识.这个命令用来得到支持的频带 (GSM 900,DCS 1800 或PCS ...

  8. 《JavaScript高级程序设计》 读书笔记(一)

    标签的位置 按照传统的做法,所有<script>元素都应该放在页面的<head>元素中,例如: <!DOCTYPE html> <html> <h ...

  9. XMPP——Smack[1]连接、登陆及账户操作

    临毕业前,应需求,花了三天写了个小的聊天工具,貌似简陋得很….若有机会再完善吧,目前毕业季,处理毕业事宜,还要准备即将的入职. 眼瞅着大学四年就这么结束了,哎. 开始吧,四篇博文简单介绍下基本实现,由 ...

  10. 从零开始学android开发-IDE空间不够报错

    E:\ProSoft\adt-bundle-windows-x86-20140321\eclipse目录下 右键eclipse用记事本打开 可以设置运行的最大的运行空间