2013-07-29 1 views
1

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

строка парам = "(NAME.FULLNAME И DOB.OPTIONAL) ИЛИ (ID И DOB.REQUIRED) ИЛИ (ID и название страны)"

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

Как:

bool name_FullName = true; 
bool dob_Optional = false; 

т.д.

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

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

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

+0

Убедитесь, что вы ловите скобку, тоже - если это не всегда (AND..AND..AND) ИЛИ (AND..AND ...) ИЛИ ... –

+0

Вы смотрели на использование одного из boolean parsers на codeplex? http://stackoverflow.com/q/5029699/2270839 – Kevin

+1

Несколько вещей, чтобы отметить о решениях: 1) Не забудьте принять во внимание булевский порядок приоритета, но до тех пор, пока вы имеете дело с скобками правильно, что, вероятно, не будет проблема, 2) Похоже, вы не собираетесь внедрять короткое замыкание, и это, наверное, хорошо, 3) если ваш интерес заключается в ясности вашего кода, это, вероятно, хорошо; если вы заинтересованы в повышении скорости (и возможностей) этого, вы можете захотеть взглянуть на токенизацию. С очень небольшим набором потенциальных аргументов было бы очень просто использовать массив идентификаторов токенов. – TASagent

ответ

5

Другой вариант - создать 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's a match 
var isMatch = data.Select("(NAME.FULLNAME AND DOB.OPTIONAL) OR (ID AND DOB.REQUIRED) OR (ID AND COUNTRY)").Any(); 
+0

Какая прохладная идея – Jonesopolis

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^