2016-08-24 16 views
6

Tôi muốn chuyển đổi một biểu thức chuỗi thành biểu thức boolean thực.Chuyển đổi biểu thức chuỗi thành logic boolean - C#

Biểu thức dưới đây sẽ là một đầu vào (string):

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

Các biến A, B và C sẽ có giá trị boolean của bạn (đúng hoặc sai).

Làm cách nào tôi có thể chuyển đổi một biểu thức chuỗi, thay thế các giá trị logic và xác thực bằng C#?

+2

có thể trùng lặp của [Đánh giá chuỗi "3 \ * (4 + 2) "yield int 18] (http://stackoverflow.com/questions/333737/evaluating-string-342-yield-int-18) –

Trả lời

-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

Nếu bạn không muốn sử dụng một số thư viện có sẵn để phân tích chuỗi đó, bạn cần phân tách các ký tự đó và thực hiện logic dựa trên so sánh. Vì vậy, ví dụ như chúng ta có "a || b", chúng ta có thể lặp lại mỗi nhân vật và quyết định hoạt động thích hợp dựa trên char == '|'. Đối với tình hình phức tạp hơn tôi muốn sử dụng một stack để theo dõi mỗi kết quả, như thế này có thể xử lý &&|| không có dấu ngoặc:

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(); 
} 
Các vấn đề liên quan