-2

What I'd like to know is how to turn a string into an operator.

I'd like to be able to compare one value with another, and the condition for whether it is true or not is a string. For example the string might ne '>' or '>=' or something else I can define like 'GREATER_THAN'.

Is the best way just a case or is there something better using all the wizadry of C#?

  • 1
    Well you can create a dictionary with all string aliases and the operators - then your code is a oneliner – Mafii Apr 20 '17 at 08:39
  • What are you actually trying to do here? Why is the operator a string? what have you tried? – Sayse Apr 20 '17 at 08:43
  • could you give an example of a possible input? what are the values you want to compare? numbers, strings? – Mong Zhu Apr 20 '17 at 08:43
  • Possible duplicate of [Convert string value to operator in C#](http://stackoverflow.com/questions/7086058/convert-string-value-to-operator-in-c-sharp) – Mong Zhu Apr 20 '17 at 08:47

3 Answers3

6

You can use this simple method:

private bool Compare(string operator, int x, int y)
{
    switch (operator)
    {
        case ">": return x > y;
        case "<": return x < y;
        case "==": return x == y;
        ... etc.            
    }
}

bool result = Compare(">", 6, 8);
Koby Douek
  • 16,156
  • 19
  • 74
  • 103
3

Something like this (let's generalize the solution):

private static bool MyCompare<T>(string comparer, T x, T y) where T: IComparable<T> {
  // we can't put x.CompareTo(y) since either x or y or both can be null 
  int v = Comparer<T>.Default.Compare(x, y);

  //TODO: you may want strict tests: if (comparer == ">") return v == 0; else if () ... 
  if (comparer.Contains('<') && v < 0)
    return true;

  if (comparer.Contains('>') && v > 0)
    return true;

  if (comparer.Contains('=') && v == 0)
    return true;

  if (comparer.Contains('!') && v != 0)
     return true;

  return false;
}

Samples:

Console.WriteLine(MyCompare(">", 3, 8) ? "Y" : "N");
Console.WriteLine(MyCompare(">=", true, false) ? "Y" : "N");
Console.WriteLine(MyCompare("<>", "a", "b") ? "Y" : "N"); // Pascal syntax
Console.WriteLine(MyCompare("!=", "a", "b") ? "Y" : "N"); // C syntax
Console.WriteLine(MyCompare("==", 3.4, 7.8) ? "Y" : "N");
Dmitry Bychenko
  • 180,369
  • 20
  • 160
  • 215
-1

No you cant define new operators, but if you want to define a comparison for a new business object of your own, then you can user operator overloading for your model. Find how to do that here

https://www.tutorialspoint.com/csharp/csharp_operator_overloading.htm

using System;
namespace OperatorOvlApplication
{
   class Box
   {
      private double length;    // Length of a box
      private double breadth;   // Breadth of a box
      private double height;    // Height of a box

      public double getVolume()
      {
         return length * breadth * height;
      }

      public void setLength( double len )
      {
         length = len;
      }

      public void setBreadth( double bre )
      {
         breadth = bre;
      }


      public void setHeight( double hei )
      {
         height = hei;
      }

      // Overload + operator to add two Box objects.
      public static Box operator+ (Box b, Box c)
      {
         Box box = new Box();
         box.length = b.length + c.length;
         box.breadth = b.breadth + c.breadth;
         box.height = b.height + c.height;
         return box;
      }

      public static bool operator == (Box lhs, Box rhs)
      {
         bool status = false;
         if (lhs.length == rhs.length && lhs.height == rhs.height && lhs.breadth == rhs.breadth)
         {
            status = true;
         }
         return status;
      }

      public static bool operator !=(Box lhs, Box rhs)
      {
         bool status = false;
         if (lhs.length != rhs.length || lhs.height != rhs.height || lhs.breadth != rhs.breadth)
         {
            status = true;
         }
         return status;
      }

      public static bool operator <(Box lhs, Box rhs)
      {
         bool status = false;
         if (lhs.length < rhs.length && lhs.height < rhs.height && lhs.breadth < rhs.breadth)
         {
            status = true;
         }
         return status;
      }

      public static bool operator >(Box lhs, Box rhs)
      {
         bool status = false;
         if (lhs.length > rhs.length && lhs.height > rhs.height && lhs.breadth > rhs.breadth)
         {
            status = true;
         }
         return status;
      }

      public static bool operator <=(Box lhs, Box rhs)
      {
         bool status = false;
         if (lhs.length <= rhs.length && lhs.height <= rhs.height && lhs.breadth <= rhs.breadth)
         {
            status = true;
         }
         return status;
      }

      public static bool operator >=(Box lhs, Box rhs)
      {
         bool status = false;
         if (lhs.length >= rhs.length && lhs.height >= rhs.height && lhs.breadth >= rhs.breadth)
         {
            status = true;
         }
         return status;
      }
      public override string ToString()
      {
         return String.Format("({0}, {1}, {2})", length, breadth, height);
      }
   }

   class Tester
   {
      static void Main(string[] args)
      {
         Box Box1 = new Box();   // Declare Box1 of type Box
         Box Box2 = new Box();   // Declare Box2 of type Box
         Box Box3 = new Box();   // Declare Box3 of type Box
         Box Box4 = new Box();
         double volume = 0.0;    // Store the volume of a box here

         // box 1 specification
         Box1.setLength(6.0);
         Box1.setBreadth(7.0);
         Box1.setHeight(5.0);

         // box 2 specification
         Box2.setLength(12.0);
         Box2.setBreadth(13.0);
         Box2.setHeight(10.0);

         //displaying the Boxes using the overloaded ToString():
         Console.WriteLine("Box 1: {0}", Box1.ToString());
         Console.WriteLine("Box 2: {0}", Box2.ToString());

         // volume of box 1
         volume = Box1.getVolume();
         Console.WriteLine("Volume of Box1 : {0}", volume);

         // volume of box 2
         volume = Box2.getVolume();
         Console.WriteLine("Volume of Box2 : {0}", volume);

         // Add two object as follows:
         Box3 = Box1 + Box2;
         Console.WriteLine("Box 3: {0}", Box3.ToString());

         // volume of box 3
         volume = Box3.getVolume();
         Console.WriteLine("Volume of Box3 : {0}", volume);

         //comparing the boxes
         if (Box1 > Box2)
            Console.WriteLine("Box1 is greater than Box2");
         else
            Console.WriteLine("Box1 is  greater than Box2");

         if (Box1 < Box2)
            Console.WriteLine("Box1 is less than Box2");
         else
            Console.WriteLine("Box1 is not less than Box2");

         if (Box1 >= Box2)
            Console.WriteLine("Box1 is greater or equal to Box2");
         else
            Console.WriteLine("Box1 is not greater or equal to Box2");

         if (Box1 <= Box2)
            Console.WriteLine("Box1 is less or equal to Box2");
         else
            Console.WriteLine("Box1 is not less or equal to Box2");

         if (Box1 != Box2)
            Console.WriteLine("Box1 is not equal to Box2");
         else
            Console.WriteLine("Box1 is not greater or equal to Box2");
         Box4 = Box3;

         if (Box3 == Box4)
            Console.WriteLine("Box3 is equal to Box4");
         else
            Console.WriteLine("Box3 is not equal to Box4");

         Console.ReadKey();
      }
   }
}

Otherwise you can write a compare function that takes you custom operator name and operands

Jins Peter
  • 2,368
  • 1
  • 18
  • 37