0

関数があるとします:

static void foo(int[,] arr, arg1)
{
    //say arg1 = row - 1

    for(int row = 0; row < arr.GetLength(0); row++)
    {  
         for(int col = 0; col < arr.GetLength(1); col++)
         {
             MessageBox.Show(arr[arg1 , col]) // should be equal to arr[row-1,col]
         }
    }
}
foo(arr, "row-1"); // should be equal to arr[row-1,col]

でループ変数を参照したいarg1
これは可能ですか?
arg1 の型は何ですか?
これはどうやって書くの?

4

2 に答える 2

1

Func<int,int>これを行うには、関数に渡します。

static void foo(int[,] arr, Func<int,int> arg1)
{
    //say arg1 = row - 1

    for(int row = 0; row < arr.GetLength(0); row++)
    {  
         for(int col = 0; col < arr.GetLength(1); col++)
         {
             int newRow = arg1(row);
             MessageBox.Show(arr[newRow, col]) // should be equal to arr[row-1,col]
         }
    }
}

次に、実行したい変換を表すlamdaで呼び出します。

foo(arr, x => x-1);

このアプローチの問題は、最初の反復ラウンドrowで値がになることです0。これから1を引くことによりarr[-1,col]、配列の範囲外にあるものを取得しようとします。あなたが実際に何を達成しようとしているのかわからないので、私はあなたがどちらかでrow変数を開始したいと思うだけだと推測することができます1

for(int row = 1; row < arr.GetLength(0); row++)

または、ラムダのより複雑なルール:

foo(arr, x => x>0 ? x-1 : 0);
于 2012-12-13T09:33:54.847 に答える
0
static void foo(int[,] arr, int arg1){
for(int row = 0; row < arr.Length; row++)
{  
     for(int col = 0; col < arr[row].Length); col++)
     {
         if (row-1 >= 0 && arg1 < arr.Length && arr[arg1 , col] == arr[row-1,col])
             MessageBox.Show("found it!"); // should be equal to arr[row-1,col]
     }
}
}
于 2012-12-13T09:33:09.613 に答える