算法开发原因:

自己一直在 配置化编程 方面努力,希望 项目复杂的功能可以用 简单的 配置来完成;

于是 在自己的网站中,使用了一个自己写的 数据库框架,为了给框架提速,于是就 想将 少于 5000 的数据表 进行全表缓存;

然后所有的 数据 就由框架 从缓存中 按照条件 检索——相当于 内存检索;

这时,问题就来了 —— 整个项目,Sql 脚本的 Where 条件,千变万化;

如何判断 某个对象 是否 符合 一个字符串的表达式,这就让我 头疼了;

于是经过搜索,得到: http://bbs.csdn.net/topics/230073145;

最终的解法 是  DataTable.Compute() 函数;还有一个 是 使用微软动态编译技术 的解决方案(这个才是真正无敌的方法)。

但是确有弊端:微软 动态编译技术 计算字符串表达式,即时计算 “1+1”,也需要 300ms,5000个数据的检索,这个是我所无法容忍的。

于是就想 写一个 字符串计算 的算法;

算法版本经历:

算法从去年5月完成,历时 2周业余时间,完成第一版;

今年7月开始,参与了几个 工作流项目的开发,觉着闹心:工作流 应该和 功能分开,结果我看到,代码中,业务代码和工作流代码 纵横交错;特别闹心;

于是就想 抽象一个流程设计器:让开发人员一心一意写业务代码,工作流的代码 全部使用配置,即时修改了流程,开发人员也不用 修改任何代码;

而 流程设计器 的的手稿过程中,发现 不可避免 的有一个环节:条件判断——这个非得使用 字符串计算算法;

于是 改版 第一版算法代码,得到今天的第二版 Laura.Compute;

算法亮点:

新版本 算法,字符串表达式 兼容 SQL脚本(和SQL脚本类似的 字符串格式);

新版本 算法,支持 动态参数(就像 SQL中  WHERE FName=@FName 一样);

新版本 支持 预分析,分析一次 多次执行(可用不同参数);

运算速度 达到  (分析+计算)*20000次 = 2000ms;  分析*1次+计算*20000次 = 150ms;

顺手实现了 字符串表达式 的内存检索(Word LIKE '%cat%'),50000单词,内存检索时间 800ms;

顺手实现了 字符串表达式 的 内存排序(Word DESC, ID ASC),50000单词,内存排序时间 2400ms;

算法思想:

算法用法:

使用代码:

<span style="font-family:Microsoft YaHei"><span style="font-size:12px">//分析一个 表达式,得到 表达式结构 对象
ExpressSchema expressSchema3 = ExpressSchema.Create("\"ShuXiaolong\" IN (\"ShuXiaolong\",\"JiangXiaoya\")");
//给定参数,计算这个 表达式结构 对象 在指定参数下 的运行结果
object value = expressSchema3.Compute(null);
Console.WriteLine(value);</span></span>

计算结果:




其他用法:

以上只是 一个简单的 表达式:判断 某个 字符串 是否在 一个 数组中。

以下即为 其他 功能(这些功能 全都是 算法的 插件,任何开发人员都可以 在 任意程序集 中 扩展本算法):

 插件名称:                                      关键字:                运算优先级:DateAddComputeMethod              DATEADD         1000000DateConvertComputeMethod         CONVERTDATE     1000000DateDiffComputeMethod                DATEDIFF        1000000DateFormatComputeMethod              DATEFORMAT      1000000DateNowComputeMethod             GETDATE         1000000DatePartComputeMethod                DATEPART        1000000GuidNewComputeMethod             NEWID           1000000StringLengthComputeMethod            LEN         1000000StringReplaceComputeMethod           REPLACE         1000000PowComputeSymbol             ^           100000MultiplyComputeSymbol             *           10000RemainComputeSymbol                %           10000DivideComputeSymbol                /           10000PlusComputeSymbol              +          1000MinusComputeSymbol              -           1000LikeEqualComputeSymbol              LIKE            700LessThanEqualComputeSymbol           <=          685GreaterThanEqualComputeSymbol            >=          680LessThanComputeSymbol                <            675GreaterThanComputeSymbol         >            670StrictEqualComputeSymbol         ===          610EqualComputeSymbol               ==            605BaseEqualComputeSymbol               =          600AndComputeSymbol             AND         525AndSignComputeSymbol             &&          525OrComputeSymbol                  OR          520OrSignComputeSymbol              ||          520TernaryComputeSymbol             ?:          100InComputeMethod                  IN          未定(默认为 0)

支持 函数表达式运算符表达式 ,这两种类型的表达式 用的是 同一个 抽象思想;

算法Demo展示:

计算对象:

<span style="font-family:Microsoft YaHei"><span style="font-size:12px">            Student stu01 = new Student { Name = "舒小龙", Number = "ShuXiaolong"};Student stu02 = new Student { Name = "江小雅", Number = "JiangXiaoya" };Student stu03 = new Student { Name = "舒珊", Number = "ShuShan" };ExpressSchema expressSchema = ExpressSchema.Create("[Number] LIKE '%Shu%'");bool result1_1 = (bool) expressSchema.Compute(stu01);bool result1_2 = (bool)expressSchema.Compute(stu02);bool result1_3 = (bool)expressSchema.Compute(stu03);Console.WriteLine(result1_1 + "|" + result1_2 + "|" + result1_3);ExpressSchema expressSchema2 = ExpressSchema.Create("[Name] + [Number]");string result2_1 = (string)expressSchema2.Compute(stu01);string result2_2 = (string)expressSchema2.Compute(stu02);string result2_3 = (string)expressSchema2.Compute(stu03);Console.WriteLine(result2_1 + "|" + result2_2 + "|" + result2_3);</span></span>

内存排序:

<span style="font-size:12px">            DataSet dataSet = GetTableRecord();  //从数据库 读取 50000 个单词DataTable dataWord = dataSet.Tables[0];DateTime dt7 = DateTime.Now;IList listResult3 = ComputeHelper.Sort("[Word],[Comment]", dataWord.Rows);  //用封装好的 排序函数 排序DateTime dt8 = DateTime.Now;Console.WriteLine("ComputeHelper.Sort()排序时间:" + (dt8 - dt7).TotalMilliseconds);Console.WriteLine(listResult3);</span>

内存筛选:

<span style="font-size:12px">            DataSet dataSet = GetTableRecord();  //从数据库 读取 50000 个单词DataTable dataWord = dataSet.Tables[0];DateTime dt7 = DateTime.Now;IList listResult3 = ComputeHelper.Filter("[Word] LIKE '%cat%'", dataWord.Rows);  //用封装好的 筛选函数 筛选DateTime dt8 = DateTime.Now;Console.WriteLine("ComputeHelper.Filter()筛选时间:" + (dt8 - dt7).TotalMilliseconds);Console.WriteLine(listResult3 + " 数目:" + listResult3.Count);</span>

算法源代码:

源码在线阅读

Ps. 最好是能将源码 发不到某个 网络版本控制器上,但是不知道 如何操作,也不知道哪个  哪个平台 有 SVN的版本控制器;

如果哪位有好的 网络版本控制器,希望推荐一哈——还是放到 版本控制器中 开源 比较好;

『开源』一个简单的 字符串计算 算法开源相关推荐

  1. 前端 JavaScript 之『节流』的简单代码实现

    前戏 首先,总结一下上一篇文章--<前端 JavaScript 之『防抖』的简单代码实现>的内容:「防抖」就是在高频率触发事件停止触发后,延时执行某个处理逻辑. 防抖虽然在一定程度上对性能 ...

  2. 一个简单的字符串,为什么 Redis 要设计的如此特别

    一个简单的字符串,为什么 Redis 要设计的如此特别 五种基本数据类型之字符串对象 二进制安全字符串 什么是二进制安全的字符串 sds 空间分配策略 空间预分配 惰性空间释放 sds 和 C 语言字 ...

  3. Flutter for App——一个简单的BMI计算APP

    一个简单的BMI计算APP 效果截图 初始化 布局 顶部区域 标题 计算结果 组合顶部区域 背景 中间区域 输入框 输入行 计算按钮 分界线 组合中间区域 底部区域 页面组合 BMI计算 Toast弹 ...

  4. java自动红包_Java一个简单的红包生成算法

    一个简单的红包生成算法,代码如下: /** * 红包 * @param n * @param money 单位:分 * @return **/ public static double[] redPa ...

  5. [日推荐]『TheGolfGame』一个高端大气上档次的小程序

    今天小编再来给大家推荐一个高端大气上档次的小程序 TheGolfGame 简介:The Golf Game是基于高尔夫教学的服务平台,为用户提供最专业的高尔夫教学指导,大量的教学视频,更有娱乐视频,让 ...

  6. 一个简单、功能完整的开源WMS​仓库管理系统

    今天给大家推荐一个简单.功能完整的仓库管理系统. 项目简介 这是基于.NetCore 7.Vue 3开发的开源项目,支持中英文,界面简单清爽,采用前后端分离架构. 该项目主要是针对小型物流仓储供应链流 ...

  7. 用C语言实现一个简单的一元线性回归算法

    今天我们用C语言实现一个简单的线性回归算法:在代码前面我们在回顾一下线性回归. 线性回归是回归问题中的一种,线性回归假设目标值与特征是线性相关的,即满足一个多元一次方程式.通过构建损失函数,来求解损失 ...

  8. 微信抢红包代码 python_用 Python 实现一个简单的微信红包算法

    今年过年各位一定在微信里抢了不少红包.那么当别人是手气王而你只抢到1分钱的时候,你有没有想过,如果你来实现红包的分配算法,会怎么写? 这里我给一个简单的实现方案. 基本思路就是,有多少个红包,就循环多 ...

  9. java license 开源_MinIO:一个基于Apache License v2.0开源协议的对象存储服务

    MinIO Quickstart Guide--快速入门 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构 ...

最新文章

  1. iOS开发swift版异步加载网络图片(带缓存和缺省图片)
  2. android 线性布局 底部,java – 如何在android线性布局中对齐父底部?
  3. HDU 6155 Subsequence Count (DP、线性代数、线段树)
  4. 【易语言】五子棋源码
  5. html中两个div垂直居中对齐,在div中垂直居中的两个元素
  6. mysql scrapy 重复数据_scrapy关于将数据保存进mysql数据库及问题解决(增删查改)
  7. matlab 把区间等分分,MATLAB数学实验报告 定积分的近似计算
  8. Spring的线程安全
  9. 《三层架构之抽象工厂加反射》纠错
  10. html文档的三大元素,html文件构成-HTML文档的三大组成元素不包括?HTML文档的三大组成元素不包 爱问知识人...
  11. 输入三个字符串,按由小到大的顺序输出
  12. Hibdernate入门
  13. 数据库mysql,oracle,sqlite,mariadb 相关收藏
  14. Unity AssetBundle 资源(纹理,网格,动画,字体,LightMap,音频等)使用 优化
  15. 2020数学建模B题
  16. [shell编程] 入门基础总结 (一) (一种豁然开朗的感觉)
  17. Linux中基于eBPF的恶意利用与检测机制
  18. 人寿保险的十大真相 保险不是什么时候都能买的
  19. winmerge多个文件夹生成html,在Git中使用Winmerge来文件di
  20. python中判断无向图是否有环_数据结构与算法:17 图

热门文章

  1. Triton针对工业系统的形势分析以及检测手段 || 后附今日情报资源
  2. zscore标准化步骤_z-score的标准化究竟怎么弄?
  3. spring的设计初衷,BOP 编程伊始,依赖注入的基本概念,AOP 编程理念
  4. 区块链技术之钱包技术
  5. android studio导入背景图片,改变图标,定时退出三个操作
  6. IDEA终于支持云端了,可同步所有配置和插件,一招搞定,重装不愁
  7. flashlight--spotlight的好帮手
  8. 计算机学院军训特色标语,各具学院特色的军训口号
  9. BZOJ2548:[CTSC2002]灭鼠行动
  10. 计算机考研英语自我介绍范文,考研复试英语自我介绍范文