Logic Evaluator в С# (оценка логических (&&, ||) выражений)

В моем проекте есть раздел Logic evaluation, он принимает ввод в виде строки, содержащей logical expressions (true/false) .

Я хочу оценить эту строку и вернуть окончательное логическое значение.

string Logic="1&0|1&(0&1)"
//string Logic="true AND false OR true AND (false AND true)"

Это будет мой Logic. Длина может увеличиться.

Есть ли способ оценить это выражение из LINQ / Dynamic LINQ?


person Sreekumar P    schedule 12.12.2011    source источник
comment
встроенный в язык запрос! = лексический анализ/оценка   -  person MerickOWA    schedule 12.12.2011
comment
По какой причине вы используете одно побитовое И, но короткое логическое ИЛИ в примере?   -  person Kieren Johnstone    schedule 13.12.2011
comment
@ Кирен Джонстон: Ой, извините.. ничего подобного... Я отредактирую.. :)   -  person Sreekumar P    schedule 13.12.2011
comment
Если можно использовать библиотеку, посмотрите здесь.   -  person Genfood    schedule 04.04.2019


Ответы (2)


способ без каких-либо сторонних библиотек - использовать DataTable с выражением.

Там у вас даже есть возможность оценить другие типы значений результата, кроме логического.

System.Data.DataTable table = new System.Data.DataTable();
table.Columns.Add("", typeof(Boolean));
table.Columns[0].Expression = "true and false or true";

System.Data.DataRow r = table.NewRow();
table.Rows.Add(r);
Boolean result = (Boolean)r[0];

синтаксис выражения не идентичен вашему примеру, но делает то же самое. Преимущество состоит в том, что его 100% .NET framework содержит --> управление Microsoft. Обработка ошибок тоже неплохая. Исключения для отсутствующих операторов и т. д.

доступные операторы

person fixagon    schedule 12.12.2011
comment
но это занимает 7 миллисекунд... мой существующий код занимает менее 1 миллисекунды.... я хочу уменьшить это - person Sreekumar P; 12.12.2011
comment
я не думаю, что это самый производительный вариант... но есть некоторые возможности - person fixagon; 12.12.2011

Это даже короче, чем решение, данное @fixagon:

System.Data.DataTable table = new System.Data.DataTable();
bool result = (bool)table.Compute("true and false or true", "");

Допускаются операторы True, False, Not, а также круглые скобки.

person DataGuy    schedule 20.07.2019
comment
У меня работает (проголосовать). В качестве дополнения: также разрешены круглые скобки для изменения приоритета. - person Teodor Tite; 26.09.2019