Оценка пользовательского логического выражения из строки

У меня есть строка параметров, которые поступают от клиента. Примером может служить:

string param = "(NAME.FULLNAME AND DOB.OPTIONAL) ИЛИ (ID И DOB.REQUIRED) ИЛИ (ID И СТРАНА)"

Теперь я проанализировал все входящие данные и булево значение, представляющее каждый параметр.

Подобно:

bool name_FullName = true;
bool dob_Optional = false;

и т.п.

Я пытаюсь найти лучший способ оценить выражение параметра клиента True или False.

Я думаю, что просто замените параметры их истинными/ложными ошибками. Затем найдите TRUE AND TRUE и удалите их и замените TRUE AND FALSE на false. Затем оцените выражение OR меня осталось.

После ввода текста это кажется хорошим способом. У кого-нибудь есть более быстрые решения, которые мне не хватает?

2 ответа

Другой вариант - создать DataTable и использовать метод Select.

// create data table
var data = new DataTable();
data.Columns.Add("NAME.FULLNAME", typeof(bool));
data.Columns.Add("DOB.OPTIONAL", typeof(bool));
data.Columns.Add("ID", typeof(bool));
data.Columns.Add("DOB.REQUIRED", typeof(bool));
data.Columns.Add("COUNTRY", typeof(bool));

// fill data table
data.Rows.Add(true, false, true, true, false);

// see if it a match
var isMatch = data.Select("(NAME.FULLNAME AND DOB.OPTIONAL) OR (ID AND DOB.REQUIRED) OR (ID AND COUNTRY)").Any();


До тех пор, пока вложенность ваших круглых скобок всегда будет похожа на ваш пример, ваше предлагаемое решение кажется очень простым в реализации. Однако, если они могут быть вложенными, то вы говорите о том, чтобы сделать конечный автомат или, по крайней мере, реализовать совпадающие скобки в некотором роде, что нетривиально.

Один из способов справиться с этим - заменить все TRUE OR FALSE на TRUE а затем заменить все (TRUE) на TRUE, которые должны обрабатывать все случаи, но это много заменяет. Тем не менее, использование строки в качестве заполнителя состояния в вашей схеме выглядит хорошо, хотя вы можете рассмотреть небольшое увеличение производительности вместо использования слов TRUE и FALSE с некоторой кодировкой типа 0 и 1 и & и | для и и/или.

licensed under cc by-sa 3.0 with attribution.