2009-03-27 18 views
5

में कनवर्ट करें, मुझे स्ट्रिंग से बूल तक जटिल एक्सप्रेशन का विश्लेषण करना होगा।जटिल बूल स्थिति को स्ट्रिंग से बूल में .NET

यह केवल हो सकते हैं:
* बूलियन मान (सही/गलत),
* कोष्ठक,
* और/या ऑपरेंड (& &, ||)

उदाहरण के लिए:

bool.Parse("((true || false) && (false || false)) || (true || false)" 

कोई विचार यह कैसे प्राप्त करें?

उत्तर

6

यहां एक चालाक मूल्यांकनकर्ता वर्ग है जो आपको सी # कोड के भीतर जेस्क्रिप्ट.NET Eval फ़ंक्शन देता है:

static public class Evaluator 
{ 
    private const string _jscriptSource = 
     @"package Evaluator 
     { 
      class Evaluator 
      { 
       public function Eval(expr : String) : String 
       { 
       return eval(expr); 
       } 
      } 
     }"; 

    static private object _evaluator; 
    static private Type _evaluatorType; 

    [SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline", 
     Justification = "Can't be done inline - too complex")] 
    static Evaluator() 
    { 
     InstantiateInternalEvaluator(); 
    } 

    static private void InstantiateInternalEvaluator() 
    { 
     JScriptCodeProvider compiler = new JScriptCodeProvider(); 

     CompilerParameters parameters; 
     parameters = new CompilerParameters(); 
     parameters.GenerateInMemory = true; 

     CompilerResults results; 
     results = compiler.CompileAssemblyFromSource(parameters, _jscriptSource); 

     Assembly assembly = results.CompiledAssembly; 
     _evaluatorType = assembly.GetType("Evaluator.Evaluator"); 

     _evaluator = Activator.CreateInstance(_evaluatorType); 
    } 

    static public int EvaluateToInteger(string statement) 
    { 
     string s = EvaluateToString(statement); 
     return int.Parse(s); 
    } 

    static public double EvaluateToDouble(string statement) 
    { 
     string s = EvaluateToString(statement); 
     return double.Parse(s); 
    } 

    static public decimal ForceEvaluateToDecimal(string statement) 
    { 
     decimal result; 
     bool s = Decimal.TryParse(statement, out result); 
     return result; 
    } 

    static public decimal EvaluateToDecimal(string statement) 
    { 
     string s = EvaluateToString(statement); 
     return decimal.Parse(s); 
    } 

    static public string EvaluateToString(string statement) 
    { 
     object o = EvaluateToObject(statement); 
     return o.ToString(); 
    } 

    static public bool EvaluateToBool(string statement) 
    { 
     object o = EvaluateToObject(statement); 
     return (bool)o; 
    } 

    static public object EvaluateToObject(string statement) 
    { 
     try 
     { 
      return _evaluatorType.InvokeMember(
       "Eval", 
       BindingFlags.InvokeMethod, 
       null, 
       _evaluator, 
       new object[] {statement} 
       ); 
     } 
     catch (Exception) 
     { 
      InstantiateInternalEvaluator(); 
      return null; 
     } 
    } 
} 

आप बस Evaluator.EvaluateoBool (स्ट्रिंग) को कॉल करें। एक मौजूदा परियोजना से उठाया गया है, तो आप ट्विक करना चाहते हैं!

+0

भयानक तृतीय पक्ष लाइब्रेरी का उपयोग कर सकते हैं! पीएस EvaluateToBool बूल वापसी – Maciej

+0

बीटीडब्ल्यू प्रदर्शन के बारे में कैसे होगा? क्या आपको लगता है कि यह एक मुद्दा हो सकता है? – Maciej

+0

"मासीज (पहली टिप्पणी) - स्कूली लड़के की प्रतिलिपि, पेस्ट और सही ढंग से त्रुटि संपादित करने में विफल। संपादित करें। धन्यवाद। –

0

मानक पद्धति है, करने के लिए:

  • स्ट्रिंग
  • निर्माण एक पेड़ हर पत्ती
  • पेड़ अभिव्यक्ति
के मूल्यांकन का दौरा करने में प्रत्येक नोड में एक ऑपरेटर और एक संकार्य डाल tokenize
2

आपके द्वारा वर्णित स्ट्रिंग मान्य सी # कोड है, इसलिए यदि आप रनटाइम पर इसे समझ सकते हैं तो आप कर सकते हैं। कई भाषाओं में यह एक अंतर्निहित कार्य है। सी # में यह नहीं है, लेकिन आप इस runtime C# interpreter

+0

आपके द्वारा उल्लिखित रनटाइम सी # अभिव्यक्ति मूल्यांकनकर्ता दिलचस्प दिखता है लेकिन डाउनलोड लिंक टूटा हुआ लगता है- क्या आपके पास स्रोत है? – Maciej

+0

क्षमा करें - काम करना शुरू कर दिया अभी व – Maciej

संबंधित मुद्दे