8

C# プログラミング言語で、多次元配列の行を渡すにはどうすればよいですか? たとえば、次のものがあるとします。

int[,] foo;
foo = new int[6,4];
int[] least;
least = new int[6];

for(int i = 0; i < 6; i++)
{
    least[i] = FindLeast(ref foo[i]);     //How do I pass the ith row of foo???
}

また、C# で長方形の配列とギザギザの配列を使用する利点を誰かに説明してもらえますか? これは他の一般的なプログラミング言語でも発生しますか? (Java?) 助けてくれてありがとう!

4

3 に答える 3

8

矩形配列の行を渡すことはできません。ギザギザの配列 (配列の配列) を使用する必要があります。

int[][] foo = new int[6][];

for(int i = 0; i < 6; i++)
    foo[i] = new int[4];

int[] least = new int[6];

for(int i = 0; i < 6; i++)
    least[i] = FindLeast(foo[i]);

編集
ギザギザの配列を使用するのが面倒で、長方形の配列がどうしても必要な場合は、簡単なトリックで節約できます。

int FindLeast(int[,] rectangularArray, int row)
于 2012-03-06T19:07:24.060 に答える
4

そのような長方形の配列では、そうではありません。それは単一のオブジェクトです。

代わりに、次のようにジャグ配列を使用する必要があります。

// Note: new int[6][4] will not compile
int[][] foo = new int[6][];
for (int i = 0; i < foo.Length; i++) {
    foo[i] = new int[4];
}

次に、各「サブ」配列を渡すことができます。

int[] least = new int[foo.Length];
for(int i = 0; i < 6; i++)
{
    least[i] = FindLeast(foo[i]);
}

foo[i]参照渡し1する必要はないことに注意してください。また、可能であれば、宣言の時点でローカル変数の値を割り当てることをお勧めします。(これにより、コードがよりコンパクトになり、理解しやすくなります。)


1これについてよくわからない場合は、C# でのパラメーターの受け渡しに関する私の記事を読むことをお勧めします。

于 2012-03-06T19:06:37.553 に答える
-1

更新: Jon Skeet が正しく指摘しているように、これは行への参照を提供するのではなく、新しいコピーを作成します。コードで行を変更する必要がある場合、この方法は機能しません。これを明確にするために、メソッドの名前を変更しました。

更新 2 : フィールドを編集し、親配列にも変更を加えたい場合は、私が作成したこのライブラリで提供するラッパーを使用できます。結果の行foo.Row(i)は配列ではなく、代わりに を実装するため、配列を渡す必要がIListある場合、これも解決策ではありません。


この拡張メソッドを使用すると、行の多次元配列をクエリできます。これは計算量が多い (効率的ではない) ことに注意してください。可能であれば、これらの状況ではジャグ配列を使用する必要があります。ただし、ジャグ配列を使用できない状況に陥った場合は、これが役立つ場合があります。

public static T[] CopyRow<T>(this T[,] arr, int row)
{
    if (row > arr.GetLength(0))
        throw new ArgumentOutOfRangeException("No such row in array.", "row");

    var result = new T[arr.GetLength(1)];
    for (int i = 0; i < result.Length; i++)
    {
        result[i] = arr[row, i];
    }
    return result;
}

コードを次のように書き換えることができます。

int[,] foo;
foo = new int[6,4];
int[] least;
least = new int[6];

for(int i = 0; i < 6; i++)
{
    least[i] = FindLeast(ref foo.CopyRow(i));
}
于 2014-05-02T13:49:17.360 に答える