2017-04-20 505 views
-2

我想知道的是如何將字符串轉換爲運算符。將字符串轉換爲運算符

我想能夠比較一個值與另一個,它是否爲真的條件是一個字符串。例如,字符串可能是'>'或'> ='或者其他我可以定義的'GREATER_THAN'。

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

+1

那麼你可以創建一個包含所有字符串別名和操作符的字典 - 那麼你的代碼就是一個oneliner – Mafii

+0

你究竟想在這裏做什麼?爲什麼運營商是一個字符串?你有什麼嘗試? – Sayse

+0

你能舉出一個可能的輸入例子嗎?你想要比較什麼值?數字,字符串? –

回答

6

你可以用這個簡單的方法:

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

不,你不能定義新運算符,但是如果你要定義你自己的一個新的業務對象的比較,那麼你可以在用戶操作符重載爲您模型。 找到該怎麼做,這裏

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

這與採購訂單的要求無關。 –

3

像這樣的東西(讓我們推廣解決方案):

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