Logic Evaluator in c# (Evaluate Logical (&& ,|| ) expressions)

10,339

Solution 1

a way without any third party libraries is to use a DataTable with expression.

There you have even the possibility to evaluate on other result value types than just boolean.

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];

the expression syntax is not identical with your example but it does the same thing. An advantage is that its 100% .NET framework contained --> Microsoft managed. The error handling is not bad neither. Exceptions for missing operators etc...

available operators

Solution 2

This is even shorter than the solution given by @fixagon:

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

True, False, Not operators, as well as parentheses are allowed.

Share:
10,339
Sreekumar P
Author by

Sreekumar P

Over the past 9 years, I am working in the field of Software Development. Using technologies Angular5, AngularJS, npm, TypeScript, SASS, ngrx (redux), Nodejs, WebSockets, Figma(UX), RxJS, HTML5, jQuery, RequireJS, Grunt, Bower, Git, Github, LESS, CSS3, Electron, ASP.net, C#.net, WCF, MVC, SQL Server 2016. Have experience in Team handling and Customer (USA) direct communications. LinkedIn Profile: https://www.linkedin.com/in/sreepk/

Updated on June 04, 2022

Comments

  • Sreekumar P
    Sreekumar P almost 2 years

    In my project there is a Logic evaluation section, it take input as a string which contains logical expressions (true/false) .

    I want to evaluate this string and return a final Boolean value.

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

    This will be my Logic. The length might increase.

    Is there any way to Evaluate this expression from LINQ / Dynamic LINQ ?

  • Sreekumar P
    Sreekumar P over 12 years
    but this is taking 7 milli seconds... my existing code takes less than 1 milli sec.... i want to reduce this
  • fixagon
    fixagon over 12 years
    i dont think its the most performant option... but has quite some possibilities
  • Teodor Tite
    Teodor Tite over 4 years
    Works for me (upvote). As an addition: also parentheses are allowed in order to change precedence.