将字符串转换为运算符

问题描述:

我想知道的是如何将字符串转换为运算符。将字符串转换为运算符

我想能够比较一个值与另一个,它是否为真的条件是一个字符串。例如,字符串可能是'>'或'> ='或者其他我可以定义的'GREATER_THAN'。

是最好的方式只是一个案例或有更好的使用所有的C#的wizadry?

+1

那么你可以创建一个包含所有字符串别名和操作符的字典 - 那么你的代码就是一个oneliner – Mafii

+0

你究竟想在这里做什么?为什么运营商是一个字符串?你有什么尝试? – Sayse

+0

你能举出一个可能的输入例子吗?你想要比较什么值?数字,字符串? –

你可以用这个简单的方法:

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

不,你不能定义新运算符,但是如果你要定义你自己的一个新的业务对象的比较,那么你可以在用户操作符重载为您模型。 找到该怎么做,这里

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(); 
     } 
    } 
} 

否则,你可以写一个比较功能,将您的自定义操作员姓名和操作数

+1

这是很多代码通过挖掘,但不幸的是没有任何这里的操作符是OP所要求的字符串。 –

+1

这与采购订单的要求无关。 –

像这样的东西(让我们推广解决方案):

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

样本:

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");