有没有办法将运算符存储在变量中?我想做这样的事情(伪代码):
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#中是否存在类似的东西?
我想是这样的。您没有定义运算符,而是定义一个为您进行更改的函数 (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);
封装具有一个参数并返回由 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
.
我尝试了一种不同的方法,使用定义运算符并通过反射访问的类 - 即您可以将运算符存储为字符串。这也允许关系运算符。
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;
}
}
使用类似的东西Func<int, int> op
或将 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)
}
}
}
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("----------");
}
}