5

C# で 3D 配列のサイズを変更しようとしています。

VB6 コードは次のようになります。

ReDim Combos(ProductNum, 4, 3)

3D 配列を使用できないためArray.Resize、C# でこの関数を実行する別の方法はありますか?

配列を 3D 配列として既に宣言しています。

int[ , , ] Combos;

しかし、私はそれをサイズ変更するのに苦労しています。何か案は?

4

3 に答える 3

4

1 次元配列の場合でも、C# では、配列のサイズ変更は、要素をサイズ変更された新しい配列にコピーすることによって機能します。

配列のサイズを頻繁に変更する必要がある場合は、コレクションの方がはるかに優れたソリューションです。

それでも配列のサイズを変更したい場合は、コードは次のとおりです。

T[,,] ResizeArray<T>(T[,,] original, int xSize, int ySize, int zSize)
{
    var newArray = new T[xSize, ySize, zSize];
    var xMin = Math.Min(xSize, original.GetLength(0));
    var yMin = Math.Min(ySize, original.GetLength(1));
    var zMin = Math.Min(zSize, original.GetLength(2));
    for (var x = 0; x < xMin; x++)
        for (var y = 0; y < yMin; y++)
            for (var z = 0; z < zMin; z++)
                newArray[x, y, z] = original[x, y, z];
    return newArray;
}
于 2012-07-05T16:29:00.557 に答える
4

.NET で多次元配列を直接再次元化する方法はありません。新しい配列を割り当ててから、 を使用して値をコピーすることをお勧めしArray.Copyます。

そうは言っても、何をしているかによっては、別のコレクション タイプの使用を検討することもできます。コレクションに関しては、VB6 よりも .NET の方が多くのオプションがあるため、多次元配列を使用する多くの場合、特にサイズを変更する場合は、他のコレクション タイプに適しています。

于 2012-07-05T16:25:09.440 に答える
1

コード:

        public int[,,] ReDimension(int[,,] OldArray,int arr1stDimLength,int arr2ndDimLength,int arr3rdDimLength)
     {
        // declare a larger array
         int[,,] NewArray = new int[arr1stDimLength,arr2ndDimLength,arr3rdDimLength];

        // determine if we are shrinking or enlarging
        const int FirstDimension = 0;
        const int SecondDimension = 1;
        const int ThirdDimension = 2;
        int xMax = 0;
        int yMax = 0;
        int zMax = 0;
         // determine if we are shrinking or enlarging columns
         if (OldArray.GetUpperBound(FirstDimension) < (arr1stDimLength - 1))
             xMax = OldArray.GetUpperBound(FirstDimension) + 1;
        else
             xMax = arr1stDimLength;

         // determine if we are shrinking or enlarging rows
         if (OldArray.GetUpperBound(SecondDimension) < (arr2ndDimLength - 1))
             yMax = OldArray.GetUpperBound(SecondDimension) + 1;
         else
             yMax = arr2ndDimLength;

         // determine if we are shrinking or enlarging depth
         if (OldArray.GetUpperBound(ThirdDimension) < (arr3rdDimLength - 1))
             zMax = OldArray.GetUpperBound(ThirdDimension) + 1;
        else
            zMax = arr3rdDimLength;

         // place values of old array into new array
         for(int z = 0; z < zMax; z++)
         {
             for(int x = 0; x < xMax; x++)
             {
                 for(int y = 0; y < yMax; y++)
                 {
                     NewArray[x, y, z] = OldArray[x, y, z];
                     Console.Write("[{0}]", NewArray[x, y, z]);
                 }
                 Console.Write("\n");
             }
             Console.Write("\n\n");
         }

         return NewArray;
    }

取得元:http ://www.codeproject.com/Articles/2503/Redhotglue-C-ArrayObject

コンソールアプリを使用してC#(VS 2008)でテスト済み:

    static void Main(string[] args)
    {
        int[, ,] combos = new int[1,2,3];
        Console.WriteLine("Combos size: {0}",combos.Length.ToString());
        combos = ReDimension(combos, 5, 5, 5);
        Console.WriteLine("New Combos size: {0}", combos.Length.ToString());
        Console.ReadKey();
    }

正常に動作しているようです。

于 2012-07-05T16:37:51.467 に答える