using System.Collections;
using System.Collections.Generic;
public static void Main()
LogicalInteger left = new LogicalInteger(1);
LogicalInteger right = new LogicalInteger(2);
LogicalStatement trueStatement = new LogicalStatement(left, right, new LogicalLesser());
Console.WriteLine("trueStatement: " + trueStatement.Evaluate());
LogicalString sleft = new LogicalString("hej");
LogicalString sright = new LogicalString("tja");
LogicalStatement falseStatement = new LogicalStatement(sleft, sright, new LogicalEqual());
Console.WriteLine("falseStatement: " + falseStatement.Evaluate());
LogicalCondition trueCondition = new LogicalCondition(trueStatement);
bool trueEval = trueCondition.Evaluate();
Console.WriteLine("trueEval: " + trueEval);
LogicalCondition falseCondition = new LogicalCondition(falseStatement);
bool falseEval = falseCondition.Evaluate();
Console.WriteLine("falseEval: " + falseEval);
LogicalCondition orCondition = new LogicalCondition(LogicalOperator.OR);
orCondition.AddCondition(trueCondition);
orCondition.AddCondition(falseCondition);
bool orEval = orCondition.Evaluate();
Console.WriteLine("orEval: " + orEval);
LogicalCondition andCondition = new LogicalCondition(LogicalOperator.AND);
andCondition.AddCondition(trueCondition);
andCondition.AddCondition(falseCondition);
bool andEval = andCondition.Evaluate();
Console.WriteLine("andEval: " + andEval);
LogicalCondition andOrCondition = new LogicalCondition(LogicalOperator.OR);
andOrCondition.AddCondition(orCondition);
andOrCondition.AddCondition(falseCondition);
bool andOrEval = andOrCondition.Evaluate();
Console.WriteLine("andOrEval: " + andOrEval);
public class LogicalCondition
LogicalOperator operation;
LogicalStatement statement;
List<LogicalCondition> conditions;
public LogicalCondition(LogicalStatement Statement)
operation = LogicalOperator.TRUE;
public LogicalCondition(LogicalOperator Operation)
conditions = new List<LogicalCondition>();
public void AddCondition(LogicalCondition condition)
conditions.Add(condition);
return EvaluateStatement();
if (operation == LogicalOperator.AND)
else if (operation == LogicalOperator.OR)
private bool EvaluateStatement()
return statement.Evaluate();
private bool EvaluateAND()
foreach (LogicalCondition c in conditions)
private bool EvaluateOR()
foreach (LogicalCondition c in conditions)
public enum LogicalOperator
public class LogicalStatement
ILogicalComparator _comparator;
public LogicalStatement(LogicalValue leftValue, LogicalValue rightValue, ILogicalComparator comparator)
_comparator = comparator;
return _comparator.Compare(_left, _right);
public abstract class LogicalValue
public abstract bool IsEqual(LogicalValue right);
public abstract bool IsNotEqual(LogicalValue right);
public abstract bool IsLesser(LogicalValue right);
public abstract bool IsGreater(LogicalValue right);
public static bool operator ==(LogicalValue left, LogicalValue right)
return left.IsEqual(right);
public static bool operator !=(LogicalValue left, LogicalValue right)
return left.IsNotEqual(right);
public static bool operator <(LogicalValue left, LogicalValue right)
return left.IsLesser(right);
public static bool operator >(LogicalValue left, LogicalValue right)
return left.IsGreater(right);
public class LogicalInteger : LogicalValue
public LogicalInteger(int val)
public override bool IsEqual(LogicalValue right)
return this._value == ((LogicalInteger) right)._value;
public override bool IsNotEqual(LogicalValue right)
return this._value != ((LogicalInteger) right)._value;
public override bool IsLesser(LogicalValue right)
return this._value < ((LogicalInteger) right)._value;
public override bool IsGreater(LogicalValue right)
return this._value > ((LogicalInteger) right)._value;
public class LogicalString : LogicalValue
public LogicalString(string val)
public override bool IsEqual(LogicalValue right)
return string.Equals(this._value, ((LogicalString) right)._value, StringComparison.InvariantCultureIgnoreCase);
public override bool IsNotEqual(LogicalValue right)
return this._value != ((LogicalString) right)._value;
public override bool IsLesser(LogicalValue right)
throw new Exception("Operator < cannot be applied to operand 'string'");
public override bool IsGreater(LogicalValue right)
throw new Exception("Operator < cannot be applied to operand 'string'");
public interface ILogicalComparator
bool Compare(LogicalValue left, LogicalValue right);
public class LogicalEqual : ILogicalComparator
public bool Compare(LogicalValue left, LogicalValue right)
public class LogicalNotEqual : ILogicalComparator
public bool Compare(LogicalValue left, LogicalValue right)
public class LogicalGreater : ILogicalComparator
public bool Compare(LogicalValue left, LogicalValue right)
public class LogicalLesser : ILogicalComparator
public bool Compare(LogicalValue left, LogicalValue right)