2017-08-24 41 views
1

是否可以使用變化的運算符編寫if語句?c#if函數:從文本文件獲得運算符

運算符(<,> = = <;> =,=)已經保存在一個文本文件中,現在可以在名爲Parameter的字符串數組中使用。

例如:參數[0] = {「<」};

代碼應該是這樣的:

if (3 "Parameter[0]" 5) {//do something} 

感謝您的幫助!

+0

[Evaluating string「3 \ *(4 + 2)」yield int 18](https://stackoverflow.com/questions/333737/evaluating-string-342-yield-int-18) –

回答

1

如果真的這是你需要的。你可以做一個開關的情況下:

switch(Operator){ 
    case '<': return a < b; 
    case '>': return a > b; 
    ... 
} 
3
Dictionary<string, Func<int, int, bool>> functions = ...; 
functions.Add("<", (a,b) => a < b); 
functions.Add(">", (a,b) => a > b); 

然後使用它:

if(functions[Parameter[0]](3, 5)){...} 
+0

不應該是'Func '?不知道... – Fildor

+0

是的,這不完全正確,我現在修好了,謝謝。 – lancew

+0

啊,當然bool ..是+1 – Fildor

2

只是爲了完整性其他兩個答案,你可以返回一個自定義比較函數:

public Func<int, int, bool> CustomComparer(string parameter) { 
    switch(parameter) { 
     case(">="): return (a, b) => a >= b; 
     case(">"): return (a, b) => a > b; 
     //... 
    } 
} 

並且將其命名爲:

if(CustomComparer("<=")(3, 5)) { ... } 

或:

var FirstIsGreater = CustomComparer(">"); 
if(FirstIsGreater(3, 5)) {... } 
0

這就是所謂的元編程,而且一般不是在C#中可用。一般情況下,你不能用任何靜態類型語言(在支持元編程的靜態類型語言中,編譯時必須知道「代碼字符串」)。你可以做的是:

  1. 不要像喬爾說的,只是做一個開關櫃(儘管如果提取操作員的困難可能會變得很難看)。
  2. 創建一個將操作符映射到函數的字典,並創建一個從源字符串中提取操作符的函數(如lancew)。
  3. Programmatically write runnable C# code and compile it at runtime(對於上帝的愛,實際上並不只是爲了比較兩個數字)。