6. Polja

Jednodimenzionalna polja

Polja su klase zbirki koje pružaju višedimenzionalnu podršku organiziranja. Jednodimenzionalna polja pružaju mogućnost pohrane i rukovanja nizom varijabli smještenih u lančanom nizu u memoriji. Jednodimenzionalna polja imaju jednu dimenziju (ili su polja prvog ranga). Polja su u C#-u deklarirana korištenjem uglatih zagrada poslije tipa polja (a ne iza modifikatora kao kod C-a), kao npr. int[] i = new int[100];

Ova linija koda deklarira varijablu i koja će postati polje tipa int veličine do 100 elemenata. Sadrži prostor za najviše 100 elemenata, rangiranih od i[0] do i[99].

Kako bi dodali vrijednosti elementima polja, možemo dodijeliti vrijednosti svakom elementu zasebno, kao što je prikazano u sljedećem primjeru:

int[] i = new int[2]; 
i[0] = 1;
i[1] = 2;

Također, možemo deklarirati polje i dodati svim elementima vrijednosti odmah u deklaraciji polja (inicijalizirati polje):

int[] i = new int[] {1,2};

ili skraćenijim zapisom:

int[] i = {1,2};

Kao opće pravilo, indeksi svih elementa polja započinju sa 0 kao početnim indeksom prvog elementa polja. Ostali elementi polja imaju indekse veće za jedan od prethodnog. Međutim, korištenjem .NET framework System.Array klase moguće je kreirati i manipulirati poljima ako je potrebna dinamička promjena veličine polja.

Svojstvo polja Length sadrži potpuni zbroj svih elemenata polja neovisno o dimenzijama. Za jednodimenzionalna polja, koja imaju samo jednu dimenziju, svojstvo Length sadrži duljinu tog jednodimenzionalnog polja. Na primjer, ovo svojstvo primjenjeno na prethodni primjer bi dalo broj 2.

Pravokutna polja

C# pruža dva tipa višedimenzionalnih polja: pravokutna i zupčasta. Pravokutno je polje s više od jedne dimenzije, gdje je dimenzija zapisana na deklaraciji polja. Za svaku novu dimenziju potrebno je dodati zarez unutar zagrada deklaracije polja. Sljedeći primjer kreira polje dimenzija 2x3:

int[,] polje = new int[2,3];

Kao i u jednodimenzionalnim poljima, pravokutna polja se mogu inicijalizirati, odnosno dodati im neke vrijednosti odmah pri deklaraciji polja. Na primjer, sljedeći kod:

int[,] polje = {{1, 2, 3}, {4, 5, 6}};

kreira polje dimenzija 2x3 sa upisanim podacima. Važno je da vrijednosti koje se žele spremiti u polje ne prelaze granice polja jer se u tom slučaju javlja greška.

Klasa System.Array sadrži nekoliko metoda za utvrđivanje veličine i granice polja. To uključuje metode GetUpperBound(int i) i GetLowerBound(int i) koje vraćaju gornji i donji indeks dimenzije i tog polja (primjetite da je i zero-based što znači da je prvi indeks 0).

Na primjer, budući da je duljina druge dimenzije polja polja 3, izraz

polje.GetLowerBound(1)

vraća 0, i izraz

polje.GetUpperBound(1)

vraća 2.

System.Array uključuje i metodu GetLength(int i), koja vraća broj elemenata određene dimenzije.

Sljedeći dio koda pomoću dvije petlje ispisuje vrijednosti svih elemenata polja polje (petlje su pobliže opisane u lekciji 9).

for (i=0; i<polje.GetLength(O); i++) 
  for (j=0; j<polje.GetLength(1); j++)
     Console.WriteLine(polje[i][j]);

Foreach petlja se također može koristiti za pristupanje elementima polja, no ona nema istu kontrolu kod pristupa vrijednostima po određenom rasporedu kao što je slučaj kod polja.

Zupčasta polja

Korištenjem zupčastih polja, možete kreirati multidimenzionalna polja s neregularnim dimenzijama. Fleksibilnost potječe iz činjenice da su multidimenzionalna polja implementirana kao polja od polja. Sljedeći primjer demonstrira kako se može deklarirati polje sastavljeno od grupe od 4 i od grupe od 6 elemenata:

int[][] polje = new int[2][];
polje[0] = new int [4];
polje[1] = new int [6];

Kod prikazuje da elementi polje[0] i polje[1] drže referencu na jednodimenzionalno polje tip int. Ilustracija kako se pristupa int vrijednostima: naredba polje[0][1] omogućava pristup drugom elementu prve grupe.

Kako bi inicijalizirali zupčasto polje pri deklaraciji, možemo koristiti kod sličan sljedećem:

int[][] polje = new int[][] {new int[] {1, 2, 3, 4}, new int[] {5, 6, 7, 8, 9, 10}};

Budite oprezni kod korištenja metoda poput GetLowerBound, GetUpperBound, GetLength, itd. kod zupčastih polja. Budući da su zupčasta polja konstruirana preko jednodimenzionalnih, ona se nebi smjela imati višedimenzionalna polja na način na koji imaju pravokutna polja.

Kako bi prešli preko svih elemenata zupčastog polja možemo koristiti kod sličan sljedećem:

for (i=0; i<polje.GetLength(O); i++) 
for (j=0; j<polje[i].GetLength(0); j++)
Console.WriteLine(polje[i][j]);

ili

for (i=O; i<polje.GetLength(0); i++) 
for (j=0; j<polje[i].Lenght; j++) 
Console.WriteLine(polje[i][j]);