返回顶部
首页 > 资讯 > 精选 >C#实现Eval的方法有哪些
  • 849
分享到

C#实现Eval的方法有哪些

2023-06-14 12:06:57 849人浏览 泡泡鱼
摘要

小编给大家分享一下C#实现Eval的方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、背景假如给定一个字符串表达式"-12 * ( - 2.2

小编给大家分享一下C#实现Eval的方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、背景

假如给定一个字符串表达式"-12 * ( - 2.2 + 7.7 ) - 44 * 2",让你计算结果,熟悉javascript的都知道有个Eval函数可以直接进行计算,而C#中却没有这个函数,下面提供三种实现方式

二、代码

public class Class1    {        #region 方法一:利用CodeCom        [Obsolete]        System.CodeDom.Compiler.ICodeCompiler comp = new Microsoft.CSharp.CSharpcodeProvider().CreateCompiler();        System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters();        public object Eval_1(string Expression)        {            StringBuilder code = new StringBuilder();            code.Append("using System; \n");            code.Append("namespace ADOGuy { \n");            code.Append(" public class _Evaluator { \n");            code.Append(" public object __foo() ");            code.Append("{ ");            code.AppendFORMat(" return ({0}); ", Expression);            code.Append("}\n");            code.Append("} }");            System.CodeDom.Compiler.CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());            System.Reflection.Assembly a = cr.CompiledAssembly;            object _Compiled = a.CreateInstance("ADOGuy._Evaluator");            System.Reflection.MethodInfo mi = _Compiled.GetType().GetMethod("__foo");            return mi.Invoke(_Compiled, null);        }        #endregion        #region 方法二:对表达式分析        string Precede(string p, string q)        {            switch (p)            {                case "+":                case "-":                    return ("*/(".IndexOf(q) != -1) ? "<" : ">";                case "*":                case "/":                    return (q == "(") ? "<" : ">";                case "(":                    return (q == ")") ? "=" : "<";                case ")":                    return (q == "(") ? "?" : ">";                case "#":                    return (q == "#") ? "=" : "<";            }            return "?";        }        Double Operate(Double a, char o, Double b)        {            switch (o)            {                case '+':                    return a + b;                case '-':                    return a - b;                case '*':                    return a * b;                case '/':                    return a / b;            }            return 0;        }        public Object Eval_2(string Expression)        {            Stack nArr = new Stack(), oArr = new Stack();            int j = 0;            Double a = 0, b = 0;            string w = "";            char o;            MatchCollection arr = Regex.Matches(Expression.Replace(" ", "") + "#", @"(((?<=(^|\())-)?\d+(\.\d+)?|\D)");            oArr.Push('#');            w = Convert.ToString(arr[j++]);            while (!(w == "#" && Convert.ToString(oArr.Peek()) == "#"))            {                if ("+-*/()#".IndexOf(w) != -1)                {                    switch (Precede(oArr.Peek().ToString(), w))                    {                        case "<":                            oArr.Push(w);                            w = Convert.ToString(arr[j++]);                            break;                        case "=":                            oArr.Pop();                            w = Convert.ToString(arr[j++]);                            break;                        case ">":                            o = Convert.ToChar(oArr.Pop());                            b = Convert.ToDouble(nArr.Pop());                            a = Convert.ToDouble(nArr.Pop());                            nArr.Push(Operate(a, o, b));                            break;                        default:                            return "Error";                    }                }                else                {                    nArr.Push(w);                    w = Convert.ToString(arr[j++]);                }            }            return nArr.Pop();        }        #endregion        #region 方法三:利用jscript的Eval        //需要引用Microsoft.JScript        [Obsolete]        readonly Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();        [Obsolete]        public object Eval_3(string Expression)        {            return Microsoft.JScript.Eval.JScriptEvaluate(Expression, ve);        }        #endregion    }

三、测试

static void Main(string[] args)        {            String strExpression = "-12 * ( - 2.2 + 7.7 ) - 44 * 2";            var obj = new Class1();            Console.WriteLine($"方法一(CodeCom法)计算结果:{obj.Eval_1(strExpression)}");            Console.WriteLine($"方法二(分析法)计算结果:{obj.Eval_2(strExpression)}");            Console.WriteLine($"方法三(JScript法)计算结果:{obj.Eval_3(strExpression)}");            Console.ReadLine();        }

运行结果:
方法一(CodeCom法)计算结果:-154
方法二(分析法)计算结果:-154
方法三(JScript法)计算结果:-154

以上是“C#实现Eval的方法有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: C#实现Eval的方法有哪些

本文链接: https://lsjlt.com/news/270626.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#实现Eval的方法有哪些
    小编给大家分享一下C#实现Eval的方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、背景假如给定一个字符串表达式"-12 * ( - 2.2...
    99+
    2023-06-14
  • C++ Date类的实现方法有哪些
    本篇内容主要讲解“C++ Date类的实现方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++ Date类的实现方法有哪些”吧!一、Date类相关接口接口展示:class D...
    99+
    2023-06-25
  • c++多态实现的方法有哪些
    C++中实现多态的方法有以下几种:1. 虚函数(Virtual Functions):在基类中声明一个虚函数,在派生类中可以对该函数...
    99+
    2023-10-12
    c++
  • C语言魔方阵的实现方法有哪些
    这篇文章主要介绍C语言魔方阵的实现方法有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!魔方阵:把1到n*n排成n行n列方阵,使方阵中的每一行、每一列以及对角线上的数之和都相同,即为n阶魔方阵。根据魔方阵的规律,我...
    99+
    2023-06-21
  • C语言Hello World实现的方法有哪些
    在C语言中,可以使用以下几种方法实现Hello World程序: 使用printf函数: #include int main...
    99+
    2023-10-24
    C语言
  • C# 实现Eval(字符串表达式)的三种方法
    目录一、背景二、代码三、测试一、背景 假如给定一个字符串表达式"-12 * ( - 2.2 + 7.7 ) - 44 * 2",让你计算结果,熟悉JavaScript的都知道有个E...
    99+
    2024-04-02
  • c语言实现多线程的方法有哪些
    C语言实现多线程的方法有以下几种:1. POSIX线程库:POSIX是一种标准接口,用于跨平台的线程编程。C语言中可以使用pthre...
    99+
    2023-08-18
    c语言
  • Redis->eval()的优势有哪些
    小编给大家分享一下Redis->eval()的优势有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!平时你用 Redis...
    99+
    2024-04-02
  • DataBinder.Eval和Eval的区别有哪些
    DataBinder.Eval和Eval都是用于数据绑定的方法,但是它们有一些区别。1. 语法:DataBinder.Eval方法使用Object的实例作为第一个参数,而Eval方法则是直接使用控件作为调用者。2. 声明周期:DataB...
    99+
    2023-08-11
    DataBinder.Eval Eval
  • C++中有哪些实现继承的方式
    C++中有哪些实现继承的方式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C++继承方式1.普通继承+父类无virtual函数若子类没有新定义virtual函数...
    99+
    2023-06-17
  • c++实现多线程的方式有哪些
    C++实现多线程的方式有以下几种:1. 使用C++11标准中的std::thread类:通过创建std::thread对象来创建新的...
    99+
    2023-09-21
    c++
  • Tree Shaking实现方法有哪些
    这篇文章主要讲解了“Tree Shaking实现方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Tree Shaking实现方法有哪些”吧!正文当使用JavaSc...
    99+
    2023-07-05
  • Spark SQL的Join实现方法有哪些
    本篇内容主要讲解“Spark SQL的Join实现方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spark SQL的Join实现方法有哪些”吧!Spa...
    99+
    2024-04-02
  • javascript实现继承的方法有哪些
    本篇内容介绍了“javascript实现继承的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ja...
    99+
    2024-04-02
  • 队列实现栈的方法有哪些
    本篇内容介绍了“队列实现栈的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先来回顾一下栈(Sta...
    99+
    2024-04-02
  • 实现CSS居中的方法有哪些
    这篇文章主要介绍了实现CSS居中的方法有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 假设现在给出这种场景:<div ...
    99+
    2024-04-02
  • java特效实现的方法有哪些
    Java特效实现的方法有以下几种:1. 使用Swing和AWT组件实现特效,如动画、轮廓、阴影、渐变、透明度等。2. 使用Java ...
    99+
    2023-06-13
    java特效 java
  • AJAX实现跨域的方法有哪些
    这篇文章将为大家详细讲解有关AJAX实现跨域的方法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。域: 域是WIN2K网络系统的安全性边界。我们知道一个计算机网最基本的单元就是“域”,这一点不是WIN...
    99+
    2023-06-08
  • Redis限流的实现方法有哪些
    本篇内容主要讲解“Redis限流的实现方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis限流的实现方法有哪些”吧!一、简单的限流基本原理当系统处理能力有限,如何组织计划外的请求对...
    99+
    2023-06-22
  • Java线程实现的方法有哪些
    这篇文章主要介绍“Java线程实现的方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java线程实现的方法有哪些”文章能帮助大家解决问题。继承 Thread 类创建线程类Thread 的实现...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作