阅前须知

  1. C# ,此篇主要讲讲逻辑,逻辑学会,其他语音都是一样的;
  2. DataTable ,DataTable是 ADO.NET 库中的中心对象。;

实际项目需求分析

在做项目时,我们会在数据库中某一张表中存入一个字段,这个字段主要是存入一个逻辑表达式,我们需要把这个字符串的逻辑表达式取出来通过判断后进行后面的操作,在这里我们发现如果使用简单的DataTable是判断不了复杂的逻辑表达式,比如7>2&&(4<7||8>4)这种有括号的,所以需要写一个通用的方法进行判断。

逻辑梳理

  1. 首先判断有无括号,如果有先判断里面的,如果使用字符串的替换,把结果替换上去
  2. 没有括号的逻辑表达式,通过拆分’||‘或’&&‘,在进行判断
  3. 写一个字符串匹配的方法,匹配’||‘和’&&‘来进行判断

开发

第一步,需要创建一个匹配’||‘和’&&‘的方法进行判断
很简单的方法,通过字符串re来决定判断a1和a2的逻辑后的结果

public Boolean LogicEx(Boolean a1,Boolean a2,string re)
{Boolean result = false;switch (re){case "&&":result = a1 && a2;break;case "||":result = a1 || a2;break;}return result;
}

第二步,需要创建一个没有括号的逻辑表达式
主要用于判断没有括号的逻辑表达式比如:4>2&&5>3&&9>3
这个方法主要是logicStr来决定两两比较的方式,调用上面的方法得到结果,然后一直重复到结束

/// <summary>
/// 判读逻辑表达式
/// </summary>
/// <param name="str">需要判断的逻辑表达式字符串</param>
/// <returns></returns>
public Boolean LogicExpression(string str)
{Boolean result = false;DataTable dt = new DataTable();string[] logicExData = Regex.Split(str, @"\|\||&&", RegexOptions.IgnoreCase);string logicStr = "||";for(int logicExIndex = 0; logicExIndex < logicExData.Length; logicExIndex++){if (logicExIndex != 0){logicStr = str.Substring(str.IndexOf(logicExData[logicExIndex - 1]) + logicExData[logicExIndex - 1].Length, 2);}Boolean re = (Boolean)dt.Compute(logicExData[logicExIndex], "");result = LogicEx(result, re, logicStr);}return result;
}

第三步,需要创建一个总的判断,这里字符串可以是有括号,或者没有

/// <summary>/// 表达式进行拆分,包括括号内的逻辑表达式以及没有括号的直接判断方法/// </summary>/// <param name="str">需要判断的表达式字符串</param>/// <returns></returns>public Boolean ExpressionSplit(string str){Boolean result = false;//首先判断括号,有多少个string[] parentheses = str.Split('(');//创建表达式判断函数DataTable dt = new DataTable();//有括号的情况if (parentheses.Length > 1){//先判断括号里面的for(int parenthesesIndex = 1; parenthesesIndex < parentheses.Length; parenthesesIndex++){//括号里面的内容string ParenthData = parentheses[parenthesesIndex].Split(')')[0];//进行替换string reParenth = "(" + ParenthData + ")";str = str.Replace(reParenth, LogicExpression(ParenthData).ToString());}//判断完括号里面后,在进行外部的判断string[] logicExData = Regex.Split(str, @"\|\||&&", RegexOptions.IgnoreCase);if (logicExData.Length > 1){string logicStr = "||";for (int logicExIndex = 0; logicExIndex < logicExData.Length; logicExIndex++){if (logicExIndex != 0){logicStr = str.Substring(str.IndexOf(logicExData[logicExIndex - 1]) + logicExData[logicExIndex - 1].Length, 2);}Boolean re = (Boolean)dt.Compute(logicExData[logicExIndex], "");result = LogicEx(result, re, logicStr);}}}else{//没括号的情况,直接判断string[] logicExData = Regex.Split(str, @"\|\||&&", RegexOptions.IgnoreCase);if (logicExData.Length > 1){string logicStr = "||";for (int logicExIndex = 0; logicExIndex < logicExData.Length; logicExIndex++){if (logicExIndex != 0){logicStr = str.Substring(str.IndexOf(logicExData[logicExIndex - 1]) + logicExData[logicExIndex - 1].Length, 2);}Boolean re = (Boolean)dt.Compute(logicExData[logicExIndex], "");result = LogicEx(result, re, logicStr);}}else{result = (Boolean)dt.Compute(logicExData[0], "");}}return result;}

调用实现

string str = "2>3||1>2||(8>3&&7>5)";
Boolean result = class1.ExpressionSplit(str);

输出result得到为:true

总计

差不多是一个把复杂的逻辑表达式拆分成一个个简单的表达式,最后通过匹配逻辑字符串来得到最终的结果。当然如果有更好的方法可以大家一起讨论下。

其实这里的逻辑表达式我们是通过一系列操作得出来的,比如我们存在数据库是RR>=9&&RR<=11:1
通过:号,前面是逻辑表达式,如果为true,则采纳后面那个数值,至于如果把字段RR转为一个简单的逻辑表达式,先是得到RR这个字段的具体值,然后把数据库的字符串RR替换成一个具体的值,最后其实就是在判断一个简单的数字逻辑表达式。
如果想要了解更多,可以添加我VX,一起讨论:y958231955

C#--如何用字符串组成的逻辑表达式进行判断,如:“7>2(4<7||8>4)“,字符串写的逻辑表达式来进行判断(只需3步)相关推荐

  1. word activex部件不能创建对象_如何用Word批量制作员工工作证?1分钟搞定1000份!只需三步...

    工作证是我们工作中很常见的东西,不过由于每个人的名字.部门.照片都不同,很多小伙伴都不知道怎么批量制作,总是傻傻地一张一张制作,这样特别浪费时间,今天小编就来跟大家分享如何批量制作! 一.准备工作 1 ...

  2. 代码批量加引号_如何用Word批量制作员工工作证?1分钟搞定1000份!只需三步

    工作证是我们工作中很常见的东西,不过由于每个人的名字.部门.照片都不同,很多小伙伴都不知道怎么批量制作,总是傻傻地一张一张制作,这样特别浪费时间,今天小编就来跟大家分享如何批量制作! 一.准备工作 1 ...

  3. python判断一个数是整数、浮点数还是字符串

    python判断一个数是整数.浮点数还是字符串 示例代码:

  4. python读取字符串的list dict_转:Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结...

    1 创建列表2 sample_list = ['a',1,('a','b')]3 4 Python 列表操作5 sample_list = ['a','b',0,1,3]6 7 得到列表中的某一个值8 ...

  5. 使用字符串定界符(标准C ++)在C ++中解析(拆分)字符串

    本文翻译自:Parse (split) a string in C++ using string delimiter (standard C++) I am parsing a string in C ...

  6. 有条件截取字符串_Python小课堂之木辛老师特别讲解:再次深入浅出字符串的格式化...

    我们已经学习了字符串和数字基础的处理方法和逻辑,大家有没有觉得使用起来很方便,编程的过程中也是很给力的呀!其实Python还有更多字符串处理的方法,大家今天就一起来体验一下吧 小朋友们可以先复习一下前 ...

  7. 汇编语言随笔(8)-实验9(显示字符串)、实验10(子程序:除法溢出,数值到字符串的转换)和课程设计1

    实验9 编程,在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串'welcome to masm!'.       80x25彩色字符模式下的显示缓冲区,每页可以显示25行,每行80个字符,其中每个字 ...

  8. c语言分隔符分离出str字符串中的数字,C语言版Tokenize()函数,由分隔符获取字符串...

    测试环境: 操作系统: Windows10 64位 运行环境: Visual Studio 10 函数: /********************************************** ...

  9. Java黑皮书课后题第6章:*6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数。编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数

    6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数.编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数 题目 题目描述 破题 代码 运行示例 题目 ...

最新文章

  1. redis序列化_实例讲解Springboot以Template方式整合Redis及序列化问题
  2. html5语音对讲,c#语音对讲demo
  3. 用store方法调列表界面的代码
  4. 深入redis内部--实现字符串
  5. fluent计算进出口的流量差
  6. usb打印机命令_打印机脱机怎么办 打印机脱机解决方法【详解】
  7. 操作系统 哈工大 李治军
  8. A tutorial video for MindManager for free
  9. 四川中职计算机专业考的学校,四川中职学校哪家专业
  10. Android 自定义View -- 简约的折线图
  11. 浅析类的const成员函数,类的const对象
  12. OpenCore黑苹果引导配置说明-基于OpenCore-0.7.0-06-08正式版
  13. crystaldiskmark使用
  14. 爱分享 IE地址栏显示空白?360电脑救援巧修复
  15. 【游戏逆向】老飞飞怀恋魅力爱玩等老飞飞瞬移分析代码
  16. Windows电脑上搭建Radius 服务器并实现802.1X认证
  17. Excel散点图 如何用平滑线 连接 不连续的点
  18. Maven3.6的下载和安装
  19. 【IPTV详解三部曲】运营商PIM组网篇
  20. 总结2019,规划2020,未完待续

热门文章

  1. 日语学习之——长音促音
  2. Linux内核下载(包括历史版本)
  3. Oracle plsql 计算日期间工作日天数
  4. 看我解决Linux下的OTG切换问题
  5. 前端拓展:如何开发一个 Chrome 插件?
  6. 允许网页打开android应用程序,通过浏览器直接打开Android应用程序
  7. 农总行计算机类,中国农业银行总行计算机类笔试经验【精选】
  8. Deep C (and C++) by Olve Maudal and Jon Jagger
  9. MySQL数据同步到ES集群(MySQL数据库与ElasticSearch全文检索的同步)
  10. 一、dubbo入门与实战