在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件。那里只是概述了一下,并没有对其使用和强大功能做深入研究,所以今天就通过一篇简单的文章来预览一下其强大的功能。本文曾在【原创】.NET开源表达式计算组件介绍与使用一文中介绍过一个.NET平台开源的表达式计算组件NCal。不过经过比较还是这个Expression Evaluator比较强大,虽然部分功能有重叠。也都能计算常规的数学表达式。freevip这个组件的功能应该说更加强大吧。同时上次的文章中,也有网友提到了另外一个在github的.NET平台的表达式计算组件DynamicExpresso。

.NET开源目录:【目录】本博客其他.NET开源项目文章目录

本文原文地址:.NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用入门

回到目录

1.基本功能介绍

Expression Evaluator是一个轻量级的可以在运行时解析C#表达式的开源免费组件。表达式求值应该在很多地方使用,例如一些工资或者成本核算系统,就需要在后台动态配置计算表达式,从而进行计算求值。经过看源代码,这组件是用到了一个Antlr3的开源工具,Antlr3是一个开源的,支持多平台的语法解析器。该组件目前还在更新中,所以值得关注。Expression Evaluator支持的特性有:

*支持算术运算符,支持关系运算符,以及逻辑运算符

*支持表达式分组和括号,以及递增递减运算符

*支持表达式属性访问以及动态类型,迅雷账号支持字符串的+运算

*支持数值类型的后缀d/f/m/l/u/ul、

*支持隐式表达式,以及成员访问操作符(.)

*支持一些默认的类型,如double, float, char, string, DateTime, Convert, Math

*支持foreach循环

等等,更多功能还期待你的使用和发现。下面我们就将介绍该组件的几个典型表达式求值的用途。

官方网站:http://csharpeval.codeplex.com/

回到目录

2.数学表达式求值

数学表达式求值应该是最常见的,一般我们在应用程序中如果需要计算,是需要对参数进行类型转换,然后在后台进行相应计算的。但是如果是计算一些符合的式子或者公式,特别是参数不一定的情况下,这个就比较麻烦,虽然也有解决办好。但总归是不好。那看看使用 Expression Evaluator的几个简单例子。

使用需要注意的是:需要直接引用ExpressionEvaluator.dll,另外Antlr3.Runtime.dll可以直接引用,也可以直接放到bin目录中,否则会提示找不到依赖文件。以前看到过一个表达式组件也是使用了这个开源的语法分析器。

看看核心代码,使用前引用主要的命名空间:using ExpressionEvaluator;

1
2
3
var expression = new CompiledExpression("1 + 2 + 3 + 4 + 5");
var result = expression.Eval();
Console.WriteLine(result);//结果 15

输出结果是 15,很明显就是2个过程,需要表达式,然后进行Eval分析计算即可。

另外在使用组件时,内部还默认注册了很多.NET值类型,可以直接使用这些类型的静态方法来进行操作。例如可以进行如下解析并执行:

1
2
3
var expression = new CompiledExpression("double.Parse('3.141592654')");
var result = expression.Eval();
Console.WriteLine(result);  // 结果是:3.141592654

是可以直接执行double的Parse方法的。目前内置支持的类型:

乐视账号

object/Object,bool/Boolean,byte/Byte,char/Char,short/Int16,int/Int32,long/Int64,ushort/UInt16,uint/UInt32,ulong/UInt64,decimal/Decimal

double/Double,float/Single,string/String

乐视账号

至于布尔类型的判断等也都支持,比较简单,乐视账号分享就不详细说了。

下面就看看Expression Evaluator的其他用法。进行简单数值计算,其他很多组件都能办到。

回到目录

3.注册类型与范围注册类型的成员

在上面例子中,系统内部已经支持了一些数值类型,可以直接进行静态函数的调用解析。但是实际中,我们的业务系统类型肯定千变万化,要满足动态计算的情况,显然上面是不够的。所以Expression Evaluator提供了这种非常给力的操作,将你的实例进行注册后,在表达式中,可以直接使用注册的名称来访问实例的成员变量,然后参与表达式的计算。这样,很多复杂的动态计算功能基本都可以实现了。

迅雷账号

看看下面这个例子,具体过程不详细见解,我在注释中写全面一点,看代码就可以理解了:

迅雷账号
1
2

迅雷账号

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void Test()
{
    var v = new MyClass();//对象实例化
    v.myExternalVar = 6;//字段赋值
    //TypeRegistry是核心的类型注册对象
    var registry = new TypeRegistry();
    //将上面的变量v进行注册,以符号vars替代
    registry.RegisterSymbol("vars", v);
    //表达式计算对象,仔细看里面的变量vars以及直接调用myExternalVar字段
    var exp = new CompiledExpression("(vars.myExternalVar + 3) / 2 * 4.5 ");
    // 设置表达式的类型注册对象为 registry,注意要在eval之前进行设置
    exp.TypeRegistry = registry;
    Console.WriteLine(exp.Eval());//结果20.25,看看怎么来的?
    //表达式计算对象,仔细看里面的变量vars以及直接调用myExternalVar字段
    var exp2 = new CompiledExpression("vars.getRandomNumber() + 3");
    // 设置表达式的类型注册对象为 registry,注意要在eval之前进行设置
    exp2.TypeRegistry = registry;
    Console.WriteLine(exp2.Eval());//结果为8,5+3
}

上面的MyClass类型的代码如下,很简单:

1
2
3
4
5
6
7
8
9
10
11
/// <summary>自定义的实体或者业务类型</summary>
public class MyClass
{
    /// <summary>一个指定的double字段</summary>
    public double myExternalVar;
    //获取double值的一个方法
    public double getRandomNumber()
爱奇艺
    {
        return 5;//假设默认返回5
    }

爱奇艺

}

下面再看一下通过字符串访问数组索引值的方法。

回到目录

4.通过字符串动态访问数组下标

和上面的例子有部分类似,开阔一下眼界吧,说明其使用是非常灵活的。爱奇艺账号为了便于演示,我们同样构造一个MyClass2类,代码如下:

1
2
3
4
5
public class MyClass2
{
    public string[] myExternalString;
    public int x;
}

下面是访问获取字符串数组的代码:

1
2
3
4
5
6
7
8
9
10
var v = new MyClass2();
v.myExternalString = new string[] { "Hello""there""World!" };
v.x = 2;
var registry = new TypeRegistry();
registry.RegisterSymbol("v", v);
var exp = new CompiledExpression("v.myExternalString[v.x/2]");
exp.TypeRegistry = registry;
Console.WriteLine(exp.Eval());//结果there

回到目录

5.资源

源代码大家可以去官网下载最新的,还是老样子,制作了一份CHM格式的帮助文档。如果打不开的同学,记得右键,属性,解除锁定哦。

C#.NET彩票数据分析相关推荐

  1. C#.NET机器学习与彩票数据分析

    C#.NET机器学习与彩票数据分析 http://www.cnblogs.com/asxinyu/p/MachineLearning_PageRank_TeamRank_2.html .NET开源项目 ...

  2. 使用Matlab进行彩票数据分析

    曾经有一个买彩票发大财的梦想(好像不只我有这样的梦,很多人都有吧),那些年偶尔买些彩票,也中些5元的10元,去彩票销售处经常看到很多买彩票的人都在分析号码走势图,那个走势图那么多期,眼睛都看花了,能从 ...

  3. python彩票数据分析案例_天津Python人工智能课程

    Python人工智能课程介绍 人工智能主要致力于计算机视觉,自然语言处理与语音识别三大领域!其基础与核心都是机器学习,当下AI时代各大行业巨头公司都在争相追逐这些热门领域,创业公司更是层出不穷,人工智 ...

  4. Python数据分析的过程记录

    Python数据分析的过程记录 文章目录 Python数据分析的过程记录 一.需求介绍 二.以第1.个为例进行数据分析 1.获取一天的数据 2.开始一天的数据的分析 3.循环日期进行多天的数据分析: ...

  5. .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)

    阅读目录 1.KwCombinatorics基本介绍 2.足球彩票排列组合应用 3.排列组合生成代码与测试 今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinator ...

  6. mssql 数据库审计账户_mssql 数据库所有者

    [求助]测试XCode v8.0的正向反向功能 目的:测试XCode v8.0的正常反向功能. 正向工程:从数据库读取架构信息,生成实体类. 反向工程:根据实体类的特性构造架构信息,反向生成数据库或者 ...

  7. 28个精品Python爬虫实战项目

    先来说说Python的优势!然后给大家看下这28个实战项目的实用性! Python跟其他语言相比,有以下优点: 1. 简单 Python是所有编程语言里面,代码量最低,非常易于读写,遇到问题时,程序员 ...

  8. 【原创】C#搭建足球赛事资料库与预测平台(6) 赔率数据表设计2

            本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录 本篇文章开始将逐步介 ...

  9. 【原创】C#搭建足球赛事资料库与预测平台(2) 数据库与XCode组件

            本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录  本篇文章开始将逐步 ...

  10. 专业创造奇迹 彩票行业进入数据分析时代

    近年来,随着互联网彩票迅猛发展,彩票大奖似乎越来越频繁,仅网易彩票今年就爆出若干大奖,1月更有易友中得2亿巨奖,创互联网彩票神话. 互联网彩票大奖频出,网易彩票更是被彩民誉为线上中奖福地,究其原因不单 ...

最新文章

  1. 探索Flutter_Image显示Webp逻辑
  2. 【Matlab】一种超简单的二维矩阵降维方法
  3. 编程必备:c/c++的编程经验技巧!
  4. 线下反欺诈风控实践要点|实操
  5. Windows删除EFI系统分区
  6. python break和continue语句
  7. red hat4 安装yum的方法
  8. USB 协议整理 五:USB概述及协议基础(四)
  9. linux查看网卡百兆还是千兆网卡,linux下如何看网卡是千兆还是百兆的?
  10. 人脸识别之数据库存取
  11. Quartus-II入门(全加器)
  12. 在Mac里读取NTFS格式的盘
  13. 轻轻松松背单词软件测试,十款背单词软件测评报告(转载)
  14. 邮箱被国际反垃圾邮件组织拉黑的解决方法
  15. unity发射弓箭轨迹的实现
  16. 对Dilated Convolution理解
  17. 《Scanner的hasNext、hasNextInt用法》
  18. 大咖云集!9月18日 Imagination Technologies 受邀参加2020中关村论坛
  19. java跳出循环的几种方式
  20. 基于SAS对美国新冠数据的分析

热门文章

  1. 乐优商城遇到的坑(四)之前台门户系统之Search.html
  2. Axure8.0基础教程(11-20)AxureRP8基础操作
  3. 数据库实验二 数据查询
  4. 软件模拟I2C(万能模板)
  5. ENVI大气校正后遥感图像颜色变了及编辑头文件
  6. 文献阅读|Nomograms列线图在肿瘤中的应用
  7. 最小二乘法正规方程推导过程
  8. 【微机原理与接口技术学习实践】汇编语言程序设计实现——.ASM文件、.OBJ文件、.EXE文件综合
  9. 写一个AndroidStudio有道翻译插件给大家
  10. C++ primer 5th 读完的一点心得体会