2013-01-10 51 views
10

有沒有將運算符存儲在變量中的方法?我想要做這樣的事情(僞代碼):將運算符存儲在變量中

void MyLoop(int start, int finish, operator op) 
{ 
    for(var i = start; i < finish; op) 
    { 
     //do stuff with i 
    } 
} 

然後我可以調用這個方法就像這樣:

MyLoop(15, 45, ++); 
MyLoop(60, 10, --); 

難道這樣的事情在C#中存在嗎?

+0

[可能的重複](http://stackoverflow.com/q/1190062/1220971)? – Bridge

+0

不知道,但用增量參數+1或-1做同樣的事情。或者用lambda Func ,你的循環看起來像:(int i = start; i tschmit007

回答

21

我想這樣的事情。你沒有定義運算符,而是一個函數(lambda),它會爲你做出改變。

void MyLoop(int start, int finish, Func<int, int> op) 
{ 
    for(var i = start; i < finish; i = op(i)) 
    { 
     //do stuff with i 
    } 
} 

然後我可以調用這個方法就像這樣:

MyLoop(15, 45, x => x+1); 
MyLoop(60, 10, x => x-1); 
+0

你自己和Soner給出了相同的答案,但你是第一個,歡呼! – JMK

0

使用類似Func<int, int> op

或更改運到字符串類型,然後檢查值,並根據它構建for循環如:

void MyLoop(int start, int finish, string op) 
{ 
    if ((op.Equals("++") && (start < finish)) 
    { 
     for(var i = start; i < finish; i++) 
     { 
      //processMethod(i) 
     } 
    } 
    else if ((op.Equals("--") && (start > finish)) 
    { 
     for(var i = start; i < finish; i--) 
     { 
      //processMethod(i) 
     } 
    } 
} 
0

你可以用常規方法包裝操作符和你代表。

7

使用Function delegate;

封裝一個方法,該方法只有一個參數,並且返回由TResult參數指定的類型的值 。

void MyLoop(int start, int finish, Func<int, int> op) 
{ 
    for(var i = start; i < finish; i = op(i)) 
    { 
     //do stuff with i 
    } 
} 

然後;

MyLoop(15, 45, x => ++x); 
MyLoop(60, 10, x => --x); 

這是DEMO

+1

非常感謝,Maarten在你之前就進入了,但演示鏈接很酷! – JMK

0
public class Program { 
    public static void Main(String[] args) { 
     Looper(x => x + 1); 
     Looper(x => ++x); 
     //Looper(x => x++); will not works 
     Looper(x => x * 2); 
    } 

    public static void Looper(Func<int, int> op) { 
     for (int i = 1; i < 10; i = op(i)) { 
      Console.WriteLine(i); 
     } 
     Console.WriteLine("----------"); 
    } 

} 
0

我嘗試了不同的方法,使用一個類定義運營商,並通過反射訪問 - 即您可以將您的運營商爲字符串。 這也允許關係運算符。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Operators ops = new Operators(); 
     object result = ops.Use("LessOrEqual", new object[] {3,2}); // output: False 
     Console.WriteLine(result.ToString()); 

     result = ops.Use("Increment", new object[] {3}); // output: 4 
     Console.WriteLine(result.ToString()); 
     Console.ReadKey(); 
    } 
} 

public class Operators 
{ 
    public object Use(String methodName, Object[] parameters) 
    { 
     object result; 
     MethodInfo mInfo = this.GetType().GetMethod(methodName); 
     result = mInfo.Invoke(this, parameters); // params for operator, komma-divided 
     return result; 
    } 


    public bool LessOrEqual(int a, int b) 
    { 
     if (a <= b) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public int Increment(int a) 
    { 
     return ++a; 
    } 
}