Оценить строковое выражение и преобразовать в bool? - PullRequest
1 голос
/ 19 февраля 2020

Я хочу вычислить строковое выражение и преобразовать результат в bool.

Например,

string expression = !((71 > 70) && (80 > 71)) || 72 < 71 ;

вышеприведенное выражение должно вычислить и вернуть true.

Кто-нибудь может подсказать, как оценить выражение и вернуть значение bool?

Ответы [ 3 ]

2 голосов
/ 19 февраля 2020

Я не верю, что существует какой-либо встроенный решатель выражений, который можно использовать для такого рода оценки выражений. Я бы порекомендовал Microsoft.CodeAnalysis.CSharp.Scripting сделать оценку.

string expression = "!((71 > 70) && (80 > 71)) || 72 < 71";
bool output = CSharpScript.EvaluateAsync<bool>(expression).Result;
// -> false

Проблемы с вашим вопросом

  • выражение не будет иметь значение true. Я не знаю, почему вы так думаете и требуете. После выполнения вышеупомянутого сценария, результирующий bool будет ложным.

!((71 > 70) && (80 > 71)) || 72 < 71
!((true) && (true)) || false
!(true & true)
false

  • Вы не можете объявить строку без кавычек; string express = "within quotes";. Выражение выше в сообщении (string expression = !((71 > 70) && (80 > 71)) || 72 < 71 ;) не является действительным C# утверждением.

Тестовый фрагмент здесь в # dotnetfiddle

2 голосов
/ 19 февраля 2020

Вы можете использовать пакет NCal c. Приведенный ниже код выдает «False»

using System;
using NCalc;

public class Program
{
    public static void Main()
    {
        Expression e = new Expression("!((71 > 70) && (80 > 71)) || 72 < 71");
        bool v = (bool)e.Evaluate();
        Console.WriteLine(v.ToString());
    }
}

. Net Fiddle: https://dotnetfiddle.net/02c5ww

0 голосов
/ 19 февраля 2020

Если ваше требование состоит в том, чтобы получить вывод expressoin в виде строки "true", используйте это,

string expression = Convert.ToString(!((71 > 70) && (80 > 71)) || 72 < 71);

А если требуется получить bool "true", используйте это,

bool expression = !((71 > 70) && (80 > 71)) || 72 < 71;

Но ваше выражение похоже на то, что оно вернет false, чтобы сделать его истинным, удалите "!" как показано ниже,

string expression = Convert.ToString(((71 > 70) && (80 > 71)) || 72 < 71);            
bool bool_expression = ((71 > 70) && (80 > 71)) || 72 < 71;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...