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ý &&
và ||
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ó 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) –