.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. leetcode—sum root to leaf number

    题目如下: Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a ...

  2. jira破解

    JIRA是一个优秀的问题(or bugs,task,improvement,new feature )跟踪及管理软件.    它由Atlassian开发,采用J2EE技术.它正被广泛的开源软件组织,以 ...

  3. 集合框架Map之entrySet方法的使用

    Map的entrySet函数的使用,取得是键和值的映射关系,Entry就是Map接口中的内部接口,类似与我们熟悉的内部类一样,内部类定义在外部类内部,可以直接访问到外部类中的成员 package cn ...

  4. light oj 1078 - Integer Divisibility

    1078 - Integer Divisibility   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 3 ...

  5. 【Stage3D学习笔记续】山寨Starling(六):动画实现和测试

    我发布了一个版本v0.2,该版本是未优化版本,且没有添加Touch事件体系,但是由于是最基础且未优化的,所以可以通过参考代码快速的了解实现原理. 接下来的一段笔记开始进行渲染优化,我会把所有的目光都集 ...

  6. js获取上传文件内容(未完待续)

    js 获取上传文件的字节数及内容 <div> 上传文件 : <input type="file" name = "file" id = &qu ...

  7. centos7 挂载ntfs移动硬盘

    第一步:下载安装rpmforge ,下载地址 http://pkgs.repoforge.org/rpmforge-release/  安装 rpm -ivh rpmforge-release-0.5 ...

  8. 常见排序算法及其java实现

    最近学习了下java,感觉java在基本语法上与C++非常相似.作为练习,我用java实现了冒泡排序.选择排序.插入排序.基尔排序.快速排序.堆排序.计数排序.合并排序. 以下为实现代码: publi ...

  9. HOG特征-理解篇

    网上去找关于HOG的资料,发现理解性的较少,并且较为冗长,为方便大家理解便自己写了篇,希望能对奋斗在特征提取第一线的同志们有所帮助: HOG即histogram of oriented gradien ...

  10. hibernate 使用C3P0数据源

    1.导入jar包: hibernate-release-4.3.5.Final/lib/optional/*.jar 2.增加配置: <!-- 配置 C3P0 数据源 --> <pr ...