# Vícerozměrné pole

### Úvod

V této kapitole se naučíme pracovat s různými druhy vícerozměrných polí.

### Deklarace dvourozměrného pole

Dvourozměrné pole se deklaruje podobně jako jednorozměrné. Jediný rozdíl je ten, že musíme nějak oddělit dva rozměry (2 dimenze). Např. takto deklarujeme prázdné dvourozměrné pole. Jediné co přibylo je čárka a údaj o velikosti druhého rozměru:

<div class="el-tabs__header is-top" id="bkmrk-deklarace"><div class="el-tabs__nav-wrap is-top"><div class="el-tabs__nav-scroll"><div class="el-tabs__nav is-top" role="tablist"><div aria-controls="pane-0" aria-selected="true" class="el-tabs__item is-top is-active" id="bkmrk-deklarace-1" role="tab" tabindex="0">Deklarace</div></div></div></div></div>```c#
// Dvourozměrné pole o velikosti 5x5
int[,] pole = new int[5, 5];
```

<div class="el-tabs__content" id="bkmrk-"><div aria-labelledby="tab-0" class="el-tab-pane" id="bkmrk--1" role="tabpanel"></div></div>K prvkům se přistupuje také podobně jako v jednorozměrném poli:

<div class="el-tabs__header is-top" id="bkmrk-p%C5%99%C3%ADstup-k-prvku-pole"><div class="el-tabs__nav-wrap is-top"><div class="el-tabs__nav-scroll"><div class="el-tabs__nav is-top" role="tablist"><div aria-controls="pane-0" aria-selected="true" class="el-tabs__item is-top is-active" id="bkmrk-p%C5%99%C3%ADstup-k-prvku-pole-1" role="tab" tabindex="0">Přístup k prvku pole</div></div></div></div></div>```c#
// Takto přistoupíme k prvku na souřadnicích [2,3] a nastavíme mu hodnotu 42
pole[2, 3] = 42;
```

<div class="el-tabs__content" id="bkmrk--2"><div aria-labelledby="tab-0" class="el-tab-pane" id="bkmrk--3" role="tabpanel"></div></div><p class="callout info">Stejně jako u jednorozměrných polí se indexuje od nuly, tudíž souřadnicemi `[2,3]` přistoupíme k prvku, který je třetí v prvním rozměru a čtvrtý v druhém.</p>

Dvourozměrné pole se dá deklarovat rovnou i s hodnotami, stejně jako to fungovalo u jednorozměrných polí:

<div class="el-tabs__header is-top" id="bkmrk-inicializace-hodnota"><div class="el-tabs__nav-wrap is-top"><div class="el-tabs__nav-scroll"><div class="el-tabs__nav is-top" role="tablist"><div aria-controls="pane-0" aria-selected="true" class="el-tabs__item is-top is-active" id="bkmrk-inicializace-hodnota-1" role="tab" tabindex="0">Inicializace hodnotami</div></div></div></div></div>```c#
// Dvourozměrné pole o velikosti 3x3 předem naplněné
int[,] pole = new int[,] { { 51, 42, 69 }, { 999, 666, 888 }, { 360, 420, 480 } };
Pokud bychom chtěli v tomto poli přistoupit k číslu 360, museli bychom použít
```

<div class="el-tabs__content" id="bkmrk--4"><div aria-labelledby="tab-0" class="el-tab-pane" id="bkmrk--5" role="tabpanel"></div></div>Pokud bychom chtěli v tomto poli přistoupit k číslu `360`, museli bychom použít souřadnice `[2,0]`.

### Metoda GetLength()

Často se stane, že při práci s vícerozměrnými poli nebudeme vědět, jak je pole velké v jakých směrech. V jednorozměrném poli nám stačila vlastnost `Length`. Abychom tyto hodnoty zjistili ve vícerozměrném poli, musíme použít metodu `GetLength()`, jež jako svůj parametr přejímá dimenzi:

<div class="el-tabs__header is-top" id="bkmrk-d%C3%A9lka-v%C3%ADcerozm%C4%9Brn%C3%A9ho"><div class="el-tabs__nav-wrap is-top"><div class="el-tabs__nav-scroll"><div class="el-tabs__nav is-top" role="tablist"><div aria-controls="pane-0" aria-selected="true" class="el-tabs__item is-top is-active" id="bkmrk-d%C3%A9lka-v%C3%ADcerozm%C4%9Brn%C3%A9ho-1" role="tab" tabindex="0">Délka vícerozměrného pole</div></div></div></div></div>```c#
// Pole 2x2
int[,] pole = { {6, 7}, {3, 9} };

// Rozměry
int delka = pole.getLength(0);
int vyska = pole.getLength(1);
```

<div class="el-tabs__content" id="bkmrk--6"><div aria-labelledby="tab-0" class="el-tab-pane" id="bkmrk--7" role="tabpanel"></div></div>Vlastnost Length u vícerozměrného pole vrací počet všech prvků v poli. Tzn. u našeho pole `2x2` nám vrátí číslo `4`.

### N-rozměrné pole

Jestli jste si mysleli, že pole může být pouze jedno či dvourozměrné, tak jste se mýlili. Pole může mít totiž nespočet dimenzí. Pro ukázku je zde pole, které má 34 dimenzí a stále funguje. Avšak pro většinu lidí už nemá takové pole reálné využití:

<div class="el-tabs__header is-top" id="bkmrk-pole-o-v%C3%ADce-dimenz%C3%ADc"><div class="el-tabs__nav-wrap is-top"><div class="el-tabs__nav-scroll"><div class="el-tabs__nav is-top" role="tablist"><div aria-controls="pane-0" aria-selected="true" class="el-tabs__item is-top is-active" id="bkmrk-pole-o-v%C3%ADce-dimenz%C3%ADc-1" role="tab" tabindex="0">Pole o více dimenzích</div></div></div></div></div>```c#
int[,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,] nesmyslneVelkePole;
```

<div class="el-tabs__content" id="bkmrk--8"><div aria-labelledby="tab-0" class="el-tab-pane" id="bkmrk--9" role="tabpanel"></div></div><p class="callout info">Toto pole ještě nemá určené velikosti daných dimenzí, tzn. není inicializované.</p>

### Pole polí

Toto je speciální druh vícerozměrných polí, jelikož všechny pole v tomto poli nemusí mít stejnou velikost. Můžeme si to ukázat např. na kinosálu. Tam nemají všechny řady stejně sedadel neboť některé chybí kvůli vchodu do sálu. Abychom popsali, jak se jmenují lidé, co v tomto sálu sedí, by nám normální dvourozměrné pole sice stačilo, ale zůstali by v něm místa, které ani neexistují. Takovéto pole můžeme založit následujícím způsobem:

<div class="el-tabs__header is-top" id="bkmrk-zalo%C5%BEen%C3%AD-pole-pol%C3%AD"><div class="el-tabs__nav-wrap is-top"><div class="el-tabs__nav-scroll"><div class="el-tabs__nav is-top" role="tablist"><div aria-controls="pane-0" aria-selected="true" class="el-tabs__item is-top is-active" id="bkmrk-zalo%C5%BEen%C3%AD-pole-pol%C3%AD-1" role="tab" tabindex="0">Založení pole polí</div></div></div></div></div>```c#
// Deklarace pole, ve kterém je 5 polí o kterých nevíme, jak velká jsou
int[][] pole = new int[5][];
```

<div class="el-tabs__content" id="bkmrk--10"><div aria-labelledby="tab-0" class="el-tab-pane" id="bkmrk--11" role="tabpanel"></div></div>Dalším příkladem může být hotel, který má `X` pater a v každém patře je `Y` pokojů. Velikost `X` bude vždy jedna, ale každé patro může mít jiný počet pokojů, tudíž pro každé `X` bude jiná velikost `Y`:

<div class="el-tabs__header is-top" id="bkmrk-zalo%C5%BEen%C3%AD-pole-pol%C3%AD-2"><div class="el-tabs__nav-wrap is-top"><div class="el-tabs__nav-scroll"><div class="el-tabs__nav is-top" role="tablist"><div aria-controls="pane-0" aria-selected="true" class="el-tabs__item is-top is-active" id="bkmrk-zalo%C5%BEen%C3%AD-pole-pol%C3%AD-3" role="tab" tabindex="0">Založení pole polí</div></div></div></div></div>```c#
// Předem naplněné pole polí
int[][] hotel = new int[][] {
    new int[]{101, 102, 103, 104, 105, 106},
    new int[]{201, 202, 203},
    new int[]{301, 302, 303}
};

// Tímto zjistíme, jaké je číslo čtvrtého pokoje v prvním patře
int cisloPokoje = hotel[0][3];
```

<div class="el-tabs__content" id="bkmrk--12"><div aria-labelledby="tab-0" class="el-tab-pane" id="bkmrk--13" role="tabpanel"></div></div>### Shrnutí

V této kapitole jsme se dozvěděli, jak používat n-rozměrné pole a jak zjistit velikosti jejich dimenzí. Také jsme si ukázali jak fungují pole polí též někdy nazývané jagged array.