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

このようなものだと思います。演算子を定義するのではなく、変更を行う関数 (ラムダ) を定義します。

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ます。

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ます。

于 2013-01-10T10:27:35.253 に答える
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 に答える