最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、背景

假如給定一個字符串表達式"-12 * ( - 2.2 + 7.7 ) - 44 * 2",讓你計算結果,熟悉JavaScript的都知道有個Eval函數(shù)可以直接進行計算,而C#中卻沒有這個函數(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 方法二:對表達式分析
        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# 實現(xiàn)Eval(字符串表達式)的三種方法的詳細內(nèi)容,更多關于C# 實現(xiàn)Eval(字符串表達式)的資料請關注腳本之家其它相關文章!

相關文章

  • C#編程實現(xiàn)帶有Aero效果的窗體示例

    C#編程實現(xiàn)帶有Aero效果的窗體示例

    這篇文章主要介紹了C#編程實現(xiàn)帶有Aero效果的窗體,涉及C#調用動態(tài)鏈接庫針對窗體屬性的相關操作技巧,需要的朋友可以參考下
    2017-07-07
  • C#中幾個未知的Visual Studio編碼技巧分享

    C#中幾個未知的Visual Studio編碼技巧分享

    用了多年的Visual Studio,今天才發(fā)現(xiàn)這個編碼技巧,真是慚愧,分享出來,算是拋磚引玉吧,需要的朋友可以參考下
    2012-11-11
  • C#實現(xiàn)簡單點餐系統(tǒng)

    C#實現(xiàn)簡單點餐系統(tǒng)

    這篇文章主要為大家詳細介紹了C#實現(xiàn)簡單點餐系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 仿orm自動生成分頁SQL分享

    仿orm自動生成分頁SQL分享

    平時接觸的數(shù)據(jù)庫有sql2000-2008,Oracle,SQLite 。 分頁邏輯,Oracle和SQLite相對好寫,就SQL事多,Sql2000下只能用top,排序2次,而Sql2005+就可以使用ROW_NUMBER()分析函數(shù)了,據(jù)說Sql2012對分頁又有了改進
    2014-01-01
  • Winform實現(xiàn)調用asp.net數(shù)據(jù)接口實例

    Winform實現(xiàn)調用asp.net數(shù)據(jù)接口實例

    這篇文章主要介紹了Winform實現(xiàn)調用asp.net數(shù)據(jù)接口的方法,以實例的形式講述了數(shù)據(jù)接口及反射辨別響應的實現(xiàn)方法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • Unity 從Resources中動態(tài)加載Sprite圖片的操作

    Unity 從Resources中動態(tài)加載Sprite圖片的操作

    這篇文章主要介紹了Unity 從Resources中動態(tài)加載Sprite圖片的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#實現(xiàn)向數(shù)組指定索引位置插入新的元素值

    C#實現(xiàn)向數(shù)組指定索引位置插入新的元素值

    這篇文章給大家介紹了利用C#實現(xiàn)向數(shù)組指定索引位置插入新的元素值,首先需要定義一個一維數(shù)組,然后修改數(shù)組的長度,從而在其中增加一個元素,需要的朋友可以參考下
    2024-02-02
  • 詳解MongoDB for C#基礎入門

    詳解MongoDB for C#基礎入門

    本篇文章主要介紹了MongoDB for C#基礎入門,具體介紹了c#中關于對MongoDB的連接,插入,查詢等,有需要的可以了解一下。
    2016-12-12
  • Unity3D實現(xiàn)漸變顏色效果

    Unity3D實現(xiàn)漸變顏色效果

    這篇文章主要為大家詳細介紹了Unity3D實現(xiàn)漸變顏色效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#窗體傳值代碼方法

    C#窗體傳值代碼方法

    在本篇文章里小編給大家整理的是關于C#窗體傳值代碼內(nèi)容,需要的朋友們可以跟著學習參考下。
    2020-02-02

最新評論

拉孜县| 中山市| 富蕴县| 兴国县| 科尔| 六枝特区| 苏尼特右旗| 安多县| 新源县| 特克斯县| 象山县| 宁海县| 和顺县| 中阳县| 英超| 永昌县| 壤塘县| 开江县| 鲁山县| 沁水县| 思茅市| 开封县| 扶余县| 苗栗县| 平湖市| 永德县| 德安县| 阿克| 蓬溪县| 兴化市| 麦盖提县| 且末县| 微山县| 托克逊县| 耒阳市| 阜南县| 昌吉市| 密山市| 文昌市| 花莲县| 子洲县|