Eric
Eric

Reputation: 359

parse string with condition to boolean

I am looking for a way to get a boolean value from a string.

I have a string, stored in a database, that is a condition to be tested with. suppose the string = "[number] < 10000" In my code I then plan to replace [number] with a actual number so the string would become "100 < 10000".

Is there a simple way to evaluate this string to a boolean. In this case it would be False.

Another example: "[number] > 100 && [number] < 1000" If number would be 200, the evaluation would be True.

What if I add code to this condition, like "if ([number] > 100 && [number] < 1000) { return true;} else {return false;}"

If there a simple way to get the return value from this string with code?

Upvotes: 2

Views: 686

Answers (2)

rahulaga-msft
rahulaga-msft

Reputation: 4144

If you need more control, you have to create expressions depending upon dynamic strings representing logical operations. For example, I have taken your first case of "[number]<1000" You can try below:

 static void Main(string[] args)
        {
            string code = "[number] < 10000".Replace("[number]", "100");
            string[] operands = code.Split('<');
            var comparison = Expression.LessThan(
              Expression.Constant(operands[0]),
              Expression.Constant(operands[1]));
            var lambda = Expression.Lambda<Func<bool>>(comparison).Compile();
            bool result = lambda();

        }

Or Alternatively you can use existing libraries or nuget packages for doing same thing in a more simpler way (under hood they do same though):

 string code = "[number] < 10000".Replace("[number]", "100");
    func = ExpressionParser.Compile<Func<bool>>(code);
    bool result = func()

It makes use of Lambda parser as shown here

Upvotes: 1

Karthik AMR
Karthik AMR

Reputation: 1714

You can make use of DynamicExpression class, it is available in this nuget package. It can evaluate expressions on the fly.

Below is an example,

var expression = System.Linq.Dynamic.DynamicExpression.ParseLambda(
            new System.Linq.Expressions.ParameterExpression[] { },
            typeof(bool),
            "100 > 1000",
            new object[] { });
        var compiledDelegate = expression.Compile();
        var result = compiledDelegate.DynamicInvoke(null);

The result will be false as the provided expression "100 > 1000" is false.

Upvotes: 2

Related Questions