.Net 中表达式的转换
.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 中表达式的转换的更多相关文章
- 中后缀表达式/洛谷P1175 表达式的转换
P1175 表达式的转换 思路:先用栈转成中缀表达式,再用栈进行计算.要输出过程,因此计算一次输出一次,但是栈没有迭代器,不好用,换成vector(可以pop_back).虽然表达式求值也可以这么做, ...
- c++中的强制转换static_cast、dynamic_cast、reinterpret_cast的不同用法儿
c++中的强制转换static_cast.dynamic_cast.reinterpret_cast的不同用法儿 虽然const_cast是用来去除变量的const限定,但是static_cast ...
- swust oj(0088)表达式的转换
表达式的转换(0088) Time limit(ms): 5000 Memory limit(kb): 65535 Submission: 435 Accepted: 93 Accepted 16级卓 ...
- MYSQL中的日期转换
MYSQL中的日期转换 网址: http://www.eygle.com/digest/2006/09/mysql_date_convert.html 对于每个类型拥有的值范围以及并且指定日期何时间值 ...
- Python与数据结构[1] -> 栈/Stack[1] -> 中缀表达式与后缀表达式的转换和计算
中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操 ...
- 洛谷P1175 表达式的转换
P1175 表达式的转换 44通过 147提交 题目提供者该用户不存在 标签云端 难度提高+/省选- 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 这题有毒 抄题解棒责五十! ...
- JavaScript 中表达式和语句的区别
1.语句和表达式 JavaScript中的表达式和语句是有区别的.一个表达式会产生一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数.下面的每行代码都是一个表达式: myvar3 + ...
- LINQ查询表达式详解(2)——查询表达式的转换
简介 C#在执行LINQ查询表达式的时候,并不会指定其执行语义,而是将查询表达式转换为遵循查询表达式模式的方法的调用.具体而言,查询表达式将转换为以下名称的调用:Where.Select.Select ...
- java中数据类型的转换
数据类型的转换,分为自动转换和强制转换. 自动转换是程序执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换 强制转换必须在代码中声明,转换顺序不受限制 自动数据类 ...
随机推荐
- leetcode—sum root to leaf number
题目如下: Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a ...
- jira破解
JIRA是一个优秀的问题(or bugs,task,improvement,new feature )跟踪及管理软件. 它由Atlassian开发,采用J2EE技术.它正被广泛的开源软件组织,以 ...
- 集合框架Map之entrySet方法的使用
Map的entrySet函数的使用,取得是键和值的映射关系,Entry就是Map接口中的内部接口,类似与我们熟悉的内部类一样,内部类定义在外部类内部,可以直接访问到外部类中的成员 package cn ...
- light oj 1078 - Integer Divisibility
1078 - Integer Divisibility PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 3 ...
- 【Stage3D学习笔记续】山寨Starling(六):动画实现和测试
我发布了一个版本v0.2,该版本是未优化版本,且没有添加Touch事件体系,但是由于是最基础且未优化的,所以可以通过参考代码快速的了解实现原理. 接下来的一段笔记开始进行渲染优化,我会把所有的目光都集 ...
- js获取上传文件内容(未完待续)
js 获取上传文件的字节数及内容 <div> 上传文件 : <input type="file" name = "file" id = &qu ...
- centos7 挂载ntfs移动硬盘
第一步:下载安装rpmforge ,下载地址 http://pkgs.repoforge.org/rpmforge-release/ 安装 rpm -ivh rpmforge-release-0.5 ...
- 常见排序算法及其java实现
最近学习了下java,感觉java在基本语法上与C++非常相似.作为练习,我用java实现了冒泡排序.选择排序.插入排序.基尔排序.快速排序.堆排序.计数排序.合并排序. 以下为实现代码: publi ...
- HOG特征-理解篇
网上去找关于HOG的资料,发现理解性的较少,并且较为冗长,为方便大家理解便自己写了篇,希望能对奋斗在特征提取第一线的同志们有所帮助: HOG即histogram of oriented gradien ...
- hibernate 使用C3P0数据源
1.导入jar包: hibernate-release-4.3.5.Final/lib/optional/*.jar 2.增加配置: <!-- 配置 C3P0 数据源 --> <pr ...