दिलचस्प पोस्ट
प्रसारण रिसीवर + SMS_RECEIVED मैं JqGrid के साथ select2 ड्रॉपडाउन के चयनित मान को कैसे बदलूं? XSD फ़ाइल के विरुद्ध XML फ़ाइल को मान्य करने का सबसे अच्छा तरीका क्या है? लाइब्रेरी फ़ंक्शन, फ़ंक्शन को स्वयं के साथ एन बार लिखने के लिए सी # धागा सुरक्षा प्राप्त / सेट के साथ मेरा वर्तमान स्थान हमेशा रिक्त स्थान देता है मैं इसे कैसे ठीक करूं? एंड्रॉइड में DatePickerDialog पर सीमा निर्धारित करें? फ़ील्ड जैसे वर्ग कोष्ठकों वाले इनपुट फ़ील्ड नामों को फ़ॉर्म करें stringByAppendingPathComponent अनुपलब्ध है asp.net mvc सजाने के लिए कई enums के साथ गतिशील एसक्यूएल (पैरामीटर के रूप में तालिका का नाम देना) क्यों नहीं एक जावा। लंग.अरेरे वर्ग है? अगर एक जावा सरणी एक ऑब्जेक्ट है, तो क्या वह ऑब्जेक्ट का विस्तार नहीं करेगी? __file__ चर का मतलब क्या करता है / करते हैं? मैं एक एसक्यूएल को तैयार स्थिति में कैसे प्राप्त करूं? गैर-शून्य विधि में रिटर्न विवरण गुम है

गणितीय अभिव्यक्तियों का मूल्यांकन करने का सर्वोत्तम और सबसे छोटा तरीका

अभिव्यक्तियों का मूल्यांकन करने के लिए कई एल्गोरिदम हैं, उदाहरण के लिए:

  1. पुनरावर्ती वंश द्वारा
  2. शंटिंग-यार्ड एल्गोरिथम
  3. पोलिश संकेतन रिवर्स

सी #। नेट प्रतिबिंब या अन्य आधुनिक तकनीक का उपयोग कर किसी भी गणितीय अभिव्यक्ति का मूल्यांकन करने का कोई तरीका है?

Solutions Collecting From Web of "गणितीय अभिव्यक्तियों का मूल्यांकन करने का सर्वोत्तम और सबसे छोटा तरीका"

इसके अलावा थॉमस के उत्तर के लिए, वास्तव में सी (जे पदावनत) जेस्क्रिप्ट पुस्तकालयों को सीधे सी # से एक्सेस करना संभव है, जिसका अर्थ है कि आप जेस्क्रिप्ट के eval फ़ंक्शन के बराबर का उपयोग कर सकते हैं।

 using Microsoft.JScript; // needs a reference to Microsoft.JScript.dll using Microsoft.JScript.Vsa; // needs a reference to Microsoft.Vsa.dll // ... string expr = "7 + (5 * 4)"; Console.WriteLine(JScriptEval(expr)); // displays 27 // ... public static double JScriptEval(string expr) { // error checking etc removed for brevity return double.Parse(Eval.JScriptEvaluate(expr, _engine).ToString()); } private static readonly VsaEngine _engine = VsaEngine.CreateEngine(); 

यह निश्चित रूप से संभव है CodeSnippetCompileUnit क्लास मूल रूप से यह है। मैंने आपको कुछ उदाहरण उपयोग कोड लिखा था आपको इन नामस्थानों को शामिल करना होगा:

  • System.CodeDom.Compiler;
  • System.CodeDom;
  • Microsoft.CSharp;
  • System.Reflection;

यहां कोड है:

 string source = @" class MyType { public static int Evaluate(<!parameters!>) { return <!expression!>; } } "; string parameters = "int a, int b, int c"; string expression = "a + b * c"; string finalSource = source.Replace("<!parameters!>", parameters).Replace("<!expression!>", expression); CodeSnippetCompileUnit compileUnit = new CodeSnippetCompileUnit(finalSource); CodeDomProvider provider = new CSharpCodeProvider(); CompilerParameters parameters = new CompilerParameters(); CompilerResults results = provider.CompileAssemblyFromDom(parameters, compileUnit); Type type = results.CompiledAssembly.GetType("MyType"); MethodInfo method = type.GetMethod("Evaluate"); // The first parameter is the instance to invoke the method on. Because our Evaluate method is static, we pass null. int result = (int)method.Invoke(null, new object[] { 4, -3, 2 }); 

'पैरामीटर' और 'अभिव्यक्ति' को जो कुछ भी बदल दें, और आपने खुद को एक सामान्य अभिव्यक्ति मूल्यांकनकर्ता मिला है

यदि आपको results.CompiledAssembly में एक FileNotFound अपवाद मिलता है, तो स्निपेट संकलन करने में विफल रहा।

आप सिस्टम पर भी नज़र डाल सकते हैं। कोडेडॉम.कोडसंसिपेट एक्सपेरशन क्लास यह अधिक विशेष रूप से अभिव्यक्तियों को पढ़ने के लिए उपयोग किया जाता है, लेकिन अपने आप में एक अभिव्यक्ति संकलित नहीं की जा सकती है, इसलिए आपको अपने आसपास एक वर्किंग क्लास और विधि बनाने के लिए अधिक कोडडेम का उपयोग करना होगा। यह उपयोगी है यदि आप प्रोग्राम को किस तरह का वर्ग तैयार कर रहे हैं, तो प्रोग्राम को तकनीकी रूप से हेरफेर करने में सक्षम होना चाहते हैं। CodeSnippetCompileUnit एक बार में एक संपूर्ण श्रमिक वर्ग उत्पन्न करने के लिए अच्छा है (और एक उदाहरण के लिए सरल), लेकिन इसे हेरफेर करने के लिए आपको असुविधाजनक स्ट्रिंग मैनिपुलेशन करना होगा

यद्यपि कंपाइलर सेवाओं का उपयोग करना एक सरल और कुशल समाधान है, यह गंभीर सुरक्षा समस्याएं उठाती है यदि अभिव्यक्ति किसी उपयोगकर्ता द्वारा दर्ज की जाती है, क्योंकि यह वस्तुतः कुछ निष्पादित कर सकता है।

एक और बहुत आसान समाधान है जो अधिक सुरक्षित है: जेस्क्रिप्ट Eval फ़ंक्शन का लाभ उठाएं। आपको इन चरणों का पालन करने की आवश्यकता है:

JsMath.js नामक जेएस फ़ाइल बनाएं:

 class JsMath { static function Eval(expression : String) : double { return eval(expression); }; } 

इसे कक्षा पुस्तकालय में संकलित करें:

 jsc /t:library JsMath.js 

अपने सी # प्रोजेक्ट में JsMath लाइब्रेरी को संदर्भित करें, और इसे इस तरह प्रयोग करें:

 double result = JsMath.Eval(expression); 

मेरे लिए विसी। पार्सर बहुत अच्छी तरह से काम करता है: इसे यहाँ की जाँच करें , यह अब तक के सबसे लचीले अभिव्यक्ति पार्सर है

(हमने इसे 'मानव-पठनीय' व्यवसाय नियम सेट अप करने के लिए उपयोग किया है, जिसमें एक एसक्यूएल सर्वर डाटाबेस द्वारा दिया गया डेटा है)

उदाहरण उपलब्ध हैं और डेवलपर द्वारा बहुत अच्छा समर्थन है (वेबसाइट के फ़ोरम की जांच करें)

ncalc सबसे अच्छा है आप कोडेप्लेक्स में भी इसे सोने का टुकड़ा में पा सकते हैं
एनसीएएलसी एक गणितीय अभिव्यक्ति मूल्यांकनकर्ता है .नेट। NCalc किसी भी अभिव्यक्ति को पार्स कर सकता है और परिणाम का मूल्यांकन कर सकता है, जिसमें स्थिर या गतिशील पैरामीटर और कस्टम फ़ंक्शन शामिल हैं।

मुझे लगता है कि यह सभी का सबसे अच्छा तरीका है। पीटर रिपैक का जवाब अद्भुत है DataColumn ऑब्जेक्ट के 'अभिव्यक्ति' तर्क का उपयोग अविश्वसनीय और आसानी से विषय को हल करता है:

 static double Evaluate(string expression) { var loDataTable = new DataTable(); var loDataColumn = new DataColumn("Eval", typeof(double), expression); loDataTable.Columns.Add(loDataColumn); loDataTable.Rows.Add(0); return (double)(loDataTable.Rows[0]["Eval"]); }