15

有没有办法将运算符存储在变量中?我想做这样的事情(伪代码):

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#中是否存在类似的东西?

4

5 回答 5

27

我想是这样的。您没有定义运算符,而是定义一个为您进行更改的函数 (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);
于 2013-01-10T10:25:07.710 回答
9

使用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.

于 2013-01-10T10:27:35.253 回答
2

我尝试了一种不同的方法,使用定义运算符并通过反射访问的类 - 即您可以将运算符存储为字符串。这也允许关系运算符。

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;
    }
}
于 2015-09-20T07:51:57.257 回答
0

使用类似的东西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)
      }
    }
}
于 2013-01-10T10:26:36.043 回答
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("----------");
    }

} 
于 2013-01-10T10:35:00.393 回答