【问题标题】:Store an operator in a variable将运算符存储在变量中
【发布时间】:2012-12-24 16:54:20
【问题描述】:

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

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

【问题讨论】:

  • 不知道,但对增量参数 +1 或 -1 执行相同操作。或者使用 lambda Func 你的循环看起来像: (int i = start; i

标签: c# variables operators


【解决方案1】:

我想是这样的。您没有定义运算符,而是定义了一个函数 (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);

【讨论】:

  • 你自己和 Soner 给出了相同的答案,但你是第一个,干杯!
【解决方案2】:

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

【讨论】:

  • 非常感谢,Maarten 在您之前就加入了,但演示链接很酷!
【解决方案3】:

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

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;
    }
}

【讨论】:

    【解决方案4】:

    使用类似Func&lt;int, int&gt; 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)
          }
        }
    }
    

    【讨论】:

      【解决方案5】:
      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("----------");
          }
      
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-29
        • 1970-01-01
        • 2018-03-01
        • 2021-08-11
        相关资源
        最近更新 更多