• 帮助类之自动解析表达式判定结果方法类


     最近一直在做一个项目,到现在为止已经算是快结束了,其中碰见一个问题:怎样判定工厂中检测数据的合格,其中已提供了检测标准,但是这个标准是文本。问题来了,怎样解析给定的标准,然后判定检测的结果值是否合格呢?当时一直困扰我的,想了好久觉得没有更好的办法,因为我们一般只能针对表达式的标准进行判定。比如:标准:1<x<2 ,检测的结果假如是1.2 那么就需要将  1.2 分别与 1 (下限)和2(上限)进行比较;还有其他比如文本型的:标准:"通过" 检测结果值是:‘不通过’或‘通过’等等,还有其他。

           好了,说到这里,我就开始对这类标准解析的过程,其中我共改过3个版本,现将最新的一份粘贴上来。附件连接一份

    先截图一张测试的截图代码:(如下图)

     

     当选中一种格式的表达式格式,然后解析成想要的结果进行判定,下面是全部代码:

     1.静态字符串,用于匹配特殊表达式类型

     1 private static string[] ExpressionChar = {">","<","","","="};
     2         
     3         /// <summary>
     4         /// 判定表达式类型
     5         /// </summary>
     6         /// <param name="exp">标准</param>
     7         /// <returns>返回标准类型 0=文本,1=单向,2=双向</returns>
     8         private static int ExpressionCategory(string exp)
     9         {
    10             int count = 0;
    11             for (int i = 0; i < exp.Length; i++)
    12             {
    13                 if (ExpressionChar.Contains(exp.Substring(i,1)))
    14                 {
    15                     count++;
    16                 }
    17             }
    18             return count;
    19         }
    View Code

     2.解析表达式,并获取标准的表达式字符串数组

     1 /// <summary>
     2         /// 解析表达式
     3         /// </summary>
     4         /// <param name="exp">标准</param>
     5         /// <returns>返回标准与值分类的字符串数组,键=标准,值=标准值</returns>
     6         private static string[] EnExpression(string exp)
     7         {
     8             int category = ExpressionCategory(exp);
     9             string[] tt=null;
    10             //文本
    11             if ( category== 0)
    12             {
    13                 tt= new string[]{exp};
    14             }
    15             //单向
    16             else if(category==1)
    17             {
    18                 string opr = exp.Substring(1, 1);
    19                 string value = exp.Substring(2);
    20                 tt= new string[] { opr, value };
    21             }
    22             //双向
    23             else if (category == 2)
    24             {
    25                 int x = exp.IndexOf("X");
    26                 string down =exp.Substring(0, x - 1);
    27                 string up = exp.Substring(x + 2);
    28                 string downOpr = exp.Substring(x - 1, 1);
    29                 string upOpr = exp.Substring(x + 1, 1);
    30                 if (downOpr == "<") downOpr = ">";
    31                 else if (downOpr == "") downOpr = "";
    32                 tt= new string[]{downOpr,down,upOpr,up};
    33             }
    34             return tt;
    35         }
    View Code

    3.判定表达式结果,比如标准是<1,需要判定的结果是0.93,结论肯定是合格的。

     1 /// <summary>
     2         /// 判定表达式结果
     3         /// </summary>
     4         /// <param name="oprChar">表达式符号</param>
     5         /// <param name="oprValue">表达式标准值</param>
     6         /// <param name="value">待判定的值</param>
     7         /// <returns>0=正确,1=错误</returns>
     8         private static int CheckNum(string oprChar, double oprValue, double value)
     9         {
    10             int result = 0;
    11             switch (oprChar)
    12             {
    13                 case "=":
    14                     if (oprValue.Equals(value)) result=0;
    15                     else result = 1;
    16                     break;
    17                 case ">":
    18                     if (value > oprValue) result = 0;
    19                     else result = 1;
    20                     break;
    21                 case "<":
    22                     if (value < oprValue) result = 0;
    23                     else result = 1;
    24                     break;
    25                 case "":
    26                     if (value >= oprValue) result = 0;
    27                     else result = 1;
    28                     break;
    29                 case "":
    30                     if (value <= oprValue) return 0;
    31                     else return 1;
    32                     break;
    33             }
    34             return result;
    35         }
    View Code

    4.因为有两种表达式:文本标准、表达式标准

      现在先说文本标准,也就是说,我采用的是直接判定文本标准是否和给定值是否相等

     1 /// <summary>
     2         /// 判定文本结果
     3         /// </summary>
     4         /// <param name="exp">文本标准值</param>
     5         /// <param name="value">待判定的值</param>
     6         /// <returns>0=正确,1=错误</returns>
     7         private static int CheckTxt(string exp, string value)
     8         {
     9             int result = 0;
    10             if (exp.Equals(value))
    11             {
    12                 result = 0;
    13             }
    14             else
    15             {
    16                 result = 1;
    17             }
    18             return result;
    19         }
    View Code

    5.表达式标准判定

     1         /// <summary>
     2         /// 解析表达式
     3         /// </summary>
     4         /// <param name="exp">标准</param>
     5         /// <returns>返回标准与值分类的字符串数组,键=标准,值=标准值</returns>
     6         private static string[] EnExpression(string exp)
     7         {
     8             int category = ExpressionCategory(exp);
     9             string[] tt=null;
    10             //文本
    11             if ( category== 0)
    12             {
    13                 tt= new string[]{exp};
    14             }
    15             //单向
    16             else if(category==1)
    17             {
    18                 string opr = exp.Substring(1, 1);
    19                 string value = exp.Substring(2);
    20                 tt= new string[] { opr, value };
    21             }
    22             //双向
    23             else if (category == 2)
    24             {
    25                 int x = exp.IndexOf("X");
    26                 string down =exp.Substring(0, x - 1);
    27                 string up = exp.Substring(x + 2);
    28                 string downOpr = exp.Substring(x - 1, 1);
    29                 string upOpr = exp.Substring(x + 1, 1);
    30                 if (downOpr == "<") downOpr = ">";
    31                 else if (downOpr == "") downOpr = "";
    32                 tt= new string[]{downOpr,down,upOpr,up};
    33             }
    34             return tt;
    35         }
    View Code

    上面的这种接卸标准的方式,虽然说在默写方面不是很完美,但是在比较常规的情况下目前都是能应付的。如果今后还有其他的判定标准,可以在这个基础上进行改进。

    以上完全是个人在工作上做的一点小结,可能还有很多不足之处,希望读者可以借鉴给出建议。

  • 相关阅读:
    浅析Go中的MPG模式(一)
    panic: assignment to entry in nil map
    Golang 新手可能会踩的 50 个坑
    小刘的go面试题
    go 单元测试整理
    go test 测试单个文件和测试单个函数
    mac pro锁屏后没有声音了怎么处理
    go json返回时间字符串处理time.Time类型
    php求一个字符串中不重复的最长子串
    业务订单号生成算法,每秒50W左右,不同机器保证不重复,包含日期可读性好
  • 原文地址:https://www.cnblogs.com/zhaosw/p/5321336.html
Copyright © 2020-2023  润新知