欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 實(shí)現(xiàn)Eval(字符串表達(dá)式)的三種方法

 更新時(shí)間:2021年04月12日 09:12:26   作者:五維思考  
這篇文章主要介紹了C# 實(shí)現(xiàn)Eval(字符串表達(dá)式)的三種方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

一、背景

假如給定一個(gè)字符串表達(dá)式"-12 * ( - 2.2 + 7.7 ) - 44 * 2",讓你計(jì)算結(jié)果,熟悉JavaScript的都知道有個(gè)Eval函數(shù)可以直接進(jìn)行計(jì)算,而C#中卻沒(méi)有這個(gè)函數(shù),下面提供三種實(shí)現(xiàn)方式

二、代碼

    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 方法二:對(duì)表達(dá)式分析
        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
    }

三、測(cè)試

        static void Main(string[] args)
        {
            String strExpression = "-12 * ( - 2.2 + 7.7 ) - 44 * 2";

            var obj = new Class1();
            Console.WriteLine($"方法一(CodeCom法)計(jì)算結(jié)果:{obj.Eval_1(strExpression)}");
            Console.WriteLine($"方法二(分析法)計(jì)算結(jié)果:{obj.Eval_2(strExpression)}");
            Console.WriteLine($"方法三(JScript法)計(jì)算結(jié)果:{obj.Eval_3(strExpression)}");
            Console.ReadLine();
        }

運(yùn)行結(jié)果:
方法一(CodeCom法)計(jì)算結(jié)果:-154
方法二(分析法)計(jì)算結(jié)果:-154
方法三(JScript法)計(jì)算結(jié)果:-154

以上就是C# 實(shí)現(xiàn)Eval(字符串表達(dá)式)的三種方法的詳細(xì)內(nèi)容,更多關(guān)于C# 實(shí)現(xiàn)Eval(字符串表達(dá)式)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#中的yield關(guān)鍵字的使用方法介紹

    C#中的yield關(guān)鍵字的使用方法介紹

    yield這個(gè)關(guān)鍵字是和迭代器掛鉤的,而且是與return一起以yield return的形式合用的,用來(lái)返回迭代器中的條目。
    2013-04-04
  • VS2015 C#生成dll文件的方法(32/64)

    VS2015 C#生成dll文件的方法(32/64)

    這篇文章主要介紹了VS2015 C#生成dll文件的方法(32/64),需要的朋友可以參考下
    2016-12-12
  • C#調(diào)用SQL?Server中有參數(shù)的存儲(chǔ)過(guò)程

    C#調(diào)用SQL?Server中有參數(shù)的存儲(chǔ)過(guò)程

    這篇文章介紹了C#調(diào)用SQL?Server中有參數(shù)存儲(chǔ)過(guò)程的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C#泛型Dictionary的用法實(shí)例詳解

    C#泛型Dictionary的用法實(shí)例詳解

    這篇文章主要介紹了C#泛型Dictionary的用法,并以實(shí)例的形式講述了對(duì)鍵值對(duì)的填充、移除及遍歷等操作,需要的朋友可以參考下
    2014-09-09
  • Unity3d實(shí)現(xiàn)Flappy Bird游戲

    Unity3d實(shí)現(xiàn)Flappy Bird游戲

    這篇文章主要為大家詳細(xì)介紹了Unity3d實(shí)現(xiàn)Flappy Bird游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • WinForm實(shí)現(xiàn)窗體最大化并遮蓋任務(wù)欄的方法

    WinForm實(shí)現(xiàn)窗體最大化并遮蓋任務(wù)欄的方法

    這篇文章主要介紹了WinForm實(shí)現(xiàn)窗體最大化并遮蓋任務(wù)欄的方法,涉及C#實(shí)現(xiàn)WinForm窗體全屏顯示的實(shí)現(xiàn)及調(diào)用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#8.0新語(yǔ)法using?declaration

    C#8.0新語(yǔ)法using?declaration

    這篇文章介紹了C#8.0的新語(yǔ)法using?declaration,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C#實(shí)現(xiàn)循環(huán)發(fā)送電腦屏幕截圖

    C#實(shí)現(xiàn)循環(huán)發(fā)送電腦屏幕截圖

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)循環(huán)發(fā)送電腦屏幕截圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C#實(shí)現(xiàn)對(duì)字符串中特定詞出現(xiàn)次數(shù)的計(jì)數(shù)過(guò)程

    C#實(shí)現(xiàn)對(duì)字符串中特定詞出現(xiàn)次數(shù)的計(jì)數(shù)過(guò)程

    LINQ(Language-Integrated Query)是C#和VB.NET中強(qiáng)大的查詢語(yǔ)言,它可以用來(lái)查詢集合、SQL數(shù)據(jù)庫(kù)、XML文檔等,在C#中,我們可以使用LINQ來(lái)簡(jiǎn)化對(duì)字符串中特定單詞出現(xiàn)次數(shù)的計(jì)數(shù)過(guò)程,需要的朋友可以參考下
    2024-08-08
  • macOS系統(tǒng)下Vscode的python配置教程

    macOS系統(tǒng)下Vscode的python配置教程

    這篇文章主要介紹了macOS系統(tǒng)下Vscode的python配置教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論