2016-08-24 163 views
6

我想將字符串表達式轉換爲實際的布爾表達式。將字符串表達式轉換爲布爾邏輯 - C#

表達下面將是一個輸入(字符串):

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

的變量A,B和C將有你的布爾值(真或假)。

如何轉換字符串表達式,替換邏輯值並使用C#驗證?

+2

[評估字符串可能重複「3 \ *(4 + 2) 「yield 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(); 
}