2013-01-10 57 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; 
    } 
}