程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> .net中處理數學表達式

.net中處理數學表達式

編輯:.NET實例教程

最近需要計算帶參數的數學表達式,比如“X+Y+10+sin(Y)”之類的的公式,

原來用VC的一個計算表達式的類,挺方便的,但是在網上找.Net居然沒找了好久。

不過還是找到兩個,一個是這個http://download.csdn.Net/source/346496

上面這個用起來還是比較方便比較快

下面這個是老外寫的,動態編譯,可以學習,但是處理起來比較慢

 



using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Text;
using System.Reflection;
using System.Text.RegularExpressions;

namespace ADOGuy
...{
    /**//// <summary>
    /// Summary description for Class1.
    /// </summary>
    public class Evaluator
    ...{
        Construction#region Construction
        public Evaluator(EvaluatorItem[] items)
        ...{
            ConstructEvaluator(items);
        }

        public Evaluator(Type returnType, string expression, string name)
        ...{
            EvaluatorItem[] items = ...{ new EvaluatorItem(returnType, expression, name) };
            ConstructEvaluator(items);
        }

        public Evaluator(EvaluatorItem item)
        ...{
            EvaluatorItem[] items = ...{ item };
            ConstructEvaluator(items);
        }

        private void Const -ructEvaluator(EvaluatorItem[] items)
        ...{
            ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());
            CompilerParameters cp = new CompilerParameters();
            cp.ReferencedAssemblIEs.Add("system.dll");
            cp.ReferencedAssemblIEs.Add("system.data.dll");
            cp.ReferencedAssemblIEs.Add("system.XML.dll");
            cp.GenerateExecutable = false;
            cp.GenerateInMemory = true;

            StringBuilder code = new StringBuilder();
            code.Append("using System;  ");
            code.Append("using System.Data;  ");
            code.Append("using System.Data.SqlClIEnt;  ");
            code.Append("using System.Data.OleDb;  ");
            code.Append("using System.XML;  ");
            code.Append("namespace ADOGuy {  ");
            code.Append("  public class _Evaluator {  ");
            foreach (EvaluatorItem item in items)
            ...{
                code.AppendFormat("    public {0} {1}() ",
                    item.ReturnType.Name,
                    item.Name);
                code.Append("{ ");
                code.AppendFormat("      return ({0}); ", item.Expression);
                code.Append("} ");
            }
            code.Append("} }");

            CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());
            if (cr.Errors.HasErrors)
            ...{
                StringBuilder error = new StringBuilder();
                error.Append("Error Compiling Expression: ");
                foreach (CompilerError err in cr.Errors)
                ...{
                    error.AppendFormat("{0} ", err.ErrorText);
                }
                throw new Exception("Error Compiling Expression: " + error.ToString());
            }
            Assembly a = cr.CompiledAssembly;
            _Compiled = a.CreateInstance("ADOGuy._Evaluator");
        }
        #endregion

        Public Members#region Public Members
        public int EvaluateInt(string name)
        ...{
            return (int)Evaluate(name);
        }

        public string EvaluateString(string name)
        ...{
            return (string)Evaluate(name);
        }

        public bool EvaluateBool(string name)
        ...{
            return (bool)Evaluate(name);
        }

        public object Evaluate(string name)
        ...{
            MethodInfo mi = _Compiled.GetType().GetMethod(name);
            return mi.Invoke(_Compiled, null);
        }
        #endregion

        Static Members#region Static Members
        static public int EvaluateToInteger(string code)
        ...{
            Evaluator eval = new Evaluator(typeof(int), code, staticMethodName);
            return (int)eval.Evaluate(staticMethodName);
        }

        static public string EvaluateToString(string code)
        ...{
                    Evaluator eval = new Evaluator(typeof(string), code, staticMethodName);
            return (string)eval.Evaluate(staticMethodName);
        }

        static public bool EvaluateToBool(string code)
        ...{
            Evaluator eval = new Evaluator(typeof(bool), code, staticMethodName);
            return (bool)eval.Evaluate(staticMethodName);
        }

        static public object EvaluateToObject(string code)
        ...{
            Evaluator eval = new Evaluator(typeof(object), code, staticMethodName);
            return eval.Evaluate(staticMethodName);
        }
        #endregion

        Private#region Private
        const string staticMethodName = "__foo";
        Type _CompiledType = null;
        object _Compiled = null;
        #endregion
    }

    public class EvaluatorItem
    ...{
        public EvaluatorItem(Type returnType, string expression, string name)
        ...{
            ReturnType = returnType;
            Expression = expression;
            Name = name;
        }

        public Type ReturnType;
        public string Name;
        public string Expression;
    }
}

/**////
    static int Compute(string expression, params int[] n)
    ...{
        foreach (int i in n)
            expression = Regex.Replace(expression, @"(?''a''.*?)(?!d)w+(?''b''.*)", "${a}" + i + "${b}");
        ADOGuy.Evaluator calculator = new ADOGuy.Evaluator(typeof(int), expression, "EvaluateInt");
        return calculator.EvaluateInt("EvaluateInt");
    }

                int L = 5;
                int N = 10;
                int SUM = Compute("L + N + 10", L, N);
                Console.WriteLine(SUM);
                Console.Read();

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved