2016-08-24 10 views
6

मैं एक स्ट्रिंग अभिव्यक्ति को वास्तविक बूलियन अभिव्यक्ति में परिवर्तित करना चाहता हूं।स्ट्रिंग अभिव्यक्ति को बूलियन तर्क में कनवर्ट करना - सी #

"(!A && B && C) || (A && !B && C) || (A && B && !C) || (A && B && C)" 

चर ए, बी और सी होगा अपने बूलियन मान (सही या गलत):

अभिव्यक्ति नीचे एक इनपुट (स्ट्रिंग) हो जाएगा।

मैं एक स्ट्रिंग अभिव्यक्ति को कैसे बदल सकता हूं, तर्क मानों को प्रतिस्थापित कर सकता हूं और सी # का उपयोग करके मान्य कर सकता हूं?

+2

[स्ट्रिंग का मूल्यांकन के संभावित डुप्लिकेट "3 \ * (4 + 2) "उपज int 18] (http://stackoverflow.com/questions/333737/evaluating-string-342-yield-int-18) –

उत्तर

-1
bool A = false; 
bool B = false; 
bool C = true; 
var expression = string.Format(@"(!{0} && {1} && {2}) || ({0} && !{1} && {2}) || ({0} && {1} && !{2}) || ({0} && {1} && {2})", A, B, C); 
expression = expression.Replace("&&", "and").Replace("||", "or").Replace("!true","False").Replace("!false","True").Replace("!True", "False").Replace("!False", "True"); 
DataTable dt = new DataTable(); 
var result = dt.Compute(expression, string.Empty); 
bool finalBooleanValue = Convert.ToBoolean(result); 
1

आपको लगता है कि स्ट्रिंग आप उन वर्णों को अलग और तुलना के आधार पर तर्क लागू करने की आवश्यकता पार्स करने के लिए कुछ उपलब्ध पुस्तकालयों का उपयोग करने के लिए नहीं करना चाहते हैं। उदाहरण के लिए कहते हैं कि हम "a || b" है, हम, हालांकि हर किरदार के पाश कर सकते हैं और उचित char == '|' के आधार पर आपरेशन निर्णय लेते हैं। और अधिक जटिल स्थिति के लिए मैं एक stack प्रयोग करेंगे प्रत्येक परिणामों पर नज़र रखने के लिए, यह एक है कि कोष्ठकों && और || संभाल कर सकते हैं की तरह:

public bool ConvertToBool(string op, bool a, bool b) 
{ 
    var st = new Stack<bool>(); 
    var opArray = op.ToCharArray(); 
    var orFlag = false; 
    var andFlag = false; 

    for (var i = 0; i < opArray.Length; i++) 
    { 
     bool top; 
     switch (opArray[i]) 
     { 
      case '|': 
       i++; 
       orFlag = true; 
       break; 
      case '&': 
       i++; 
       andFlag = true; 
       break; 
      case 'a': 
       if (orFlag) 
       { 
        top = st.Pop(); 
        st.Push(top || a); 
        orFlag = false; 
       } 
       else if (andFlag) 
       { 
        top = st.Pop(); 
        st.Push(top && a); 
        andFlag = false; 
        continue; 
       } 
       st.Push(a); 
       break; 
      case 'b': 
       if (orFlag) 
       { 
        top = st.Pop(); 
        st.Push(top && b); 
        orFlag = false; 
       } 
       else if (andFlag) 
       { 
        top = st.Pop(); 
        st.Push(top && b); 
        andFlag = false; 
        continue; 
       } 
       st.Push(b); 
       break; 
     } 
    } 
    return st.Pop(); 
} 
संबंधित मुद्दे