Jak wydobyć tablicę 2-wymiarową z 3-wymiarowej?

0

Mam tablicę int[,,] PlanszeSudoku.plansze (dużo plansz) i metodę wypisującą, która przyjmuje int[,] (jedną planszę).
Jak przekazać z jednej do drugiej?

Gdy napiszę tak:

Sudoku.wypiszSudoku(PlanszeSudoku.plansze);

to jest błąd bo tablicę 3D przekazuję, a wymaga 2D, a gdy napiszę tak:

Sudoku.wypiszSudoku(PlanszeSudoku.plansze[0]);

to jest błąd, bo za mało indeksów.

1

Nie da się, musisz albo sam napisać procedurę konwersji z tablicy 3d do 2d albo zamiast tego użyć tzw. 'jagged array'.

1

Osobiście zrobiłbym tablice 1 wymiarową obrazującą 3 wymiar - powiedzmy oś Z. Teraz w tej tabeli przechowywałbym tablice 2 wymiarowe (płaskie) które mają określone X i Y. Przykład
int[][,] plansze = new int[rozmiar_Z][,];
plansze[0] = new int[x,y] {elementy};

1

Możesz użyć Jagged Array

lub napisać metodę rozszerzającą, która z [,,] zwróci podtablicę [,]

lub napisać własną klasę, która np. będzie miała indexer, który zwróci "podtablicę"
Taki przykładowy zaczątek kodu

 
public class Array3D<T>
    {
        private T[, ,] _array;

        public Array3D(int x, int y, int z)
        {
            _array = new T[x, y, z];
        }

        public T this[int x, int y, int z]
        {
            get { return _array[x, y, z]; }
            set { _array[x, y, z] = value; }
        }
        public T[,] this[int x]
        {
            get {
                var res = new T[_array.GetLength(1), _array.GetLength(2)];
                for (int i = 0; i < _array.GetLength(1); i++)
                    for (int j = 0; j < _array.GetLength(2); j++)
                        res[i, j] = _array[x, i, j];
                return res;
            }
            set { }
        }
    }
1

A po co sobie utrudniać życie trójwymiarową tablicą w tym przypadku? Nie prościej użyć List<int[,]>?

0

Piszę swój pierwszy większy program w C#, więc na razie poznaję język. Zainteresuję się tym jagged array i List<int[,]>. Ten ostatni wydaje się być w porządku w przypadku dynamicznego dokładania tabel 2D, na razie potrzebuję na sztywno wpisanych kilka, ale w przyszłości na pewno się przyda.

Póki co napisałem funkcję przepisującą z tabeli 3D o wskazanym indeksie do tabeli 2D.

Za propozycje plusy, dzięki

0

jagged array to tablica tablic, czyli zamiast int[,] masz int[][]. z takiej tablicy bez problemu wyciągniesz cały wiersz, bo elementy int[][] są typu int[].

właściwie to nie wiem po co w C# istnieją tablice wielowymiarowe typu [,]. to dobra idea na papierze, ale są uciążliwe w użyciu i działają wolniej (brak optymalizacji ze strony maszyny wirtualnej).

0

Tablice wielowymiarowe zajmują mniej pamięci, są szybciej alokowane, i mniej obciążające dla garbage collectora. Dostęp do elementów jest niestety wolniejszy, ale to już chyba efekt sprawdzania zakresu wykonywanego przez CLR. Niemniej jednak, chyba lepiej użyć tablicy jednowymiarowej i przeliczać indeksy samodzielnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1