Massiivid ja System.Collection.Generic nimeruum CSharp keeles

From ICO wiki
Jump to navigationJump to search

Massiivide kasutamine C# programmeerimiskeeles

Massiivid

Massiiv on ühetüübiliste muutujate kogum, millistel on üks nimi ja mis on üksteisest eristatavad indeksi poolest. Massiivid lihtsustavad oluliselt ühetüübiliste andmete töötlemist. Lihtsustamine tuleneb sellest, et programmi täitmise käigus on võimalik indeksit lihtsalt muuta ja seega on lihtsam pöörduda vajaliku muutuja poole.

Massiivid võivad olla ühemõõtmelised (jada, rida), kahemõõtmelised (tabel, maatriks), kolmemõõtmelised (kuup), jne.

Näide

int[] mass = new int[10];
mass[0]=1;
mass[1]=1;
for (int i = 2; i <= 9; i++)
mass[i] = mass[i - 1] + mass[i - 2];
for (int i = 0; i <= 9; i++)
Console.WriteLine(mass[i]);

Selles näites luuakse ühemõõtmeline massiiv mass, millel on kümme liiget, antakse kahele esimesele liikmele väärtus „1” ja täidetakse ülejäänud liikmed kahe eelneva liikme summaga.

Seejärel trükitakse kõik väärtused järjest (alustades nullindast liikmest ja lõpetades üheksandaga) konsooliaknasse.

Massiivi hea ja vead

Massiivi näol on tegemist kiire, kuid suhteliselt jäiga andmeobjektiga. Nii ei saa näiteks massiivi täitumisel massiivi mõõtmete pikkuseid hiljem muuta, massiiv peab alati koosnema ühte tüüpi muutujatest ning massiivi liikmed ei saa olla kirjutamiskaitsega (read-only).


Massiivi loomiseks tuleb näidata ära massiivi liikmete tüüp, massiivi mõõtmete arv ning massiivi nimi.

Näide

int[] taisArvud; // deklareeritakse ühemõõtmeline Int32 tüüpi massiiv taisArvud
long[,] komaArvudeTabel; // deklareeritakse kahemõõtmeline long tüüpi massiiv komaArvudeTabel

Massiivide loomisel on nõutav mõõtmete pikkuste määramine (ehk mitu liiget ühte mõõtmesse mahub), kusjuures erinevad mõõtmed võivad olla erineva pikkusega. Näide

int[] taisArvud = new int[10]; // luuakse uus ühemõõtmeline int massiiv, pikkusega 10

long[,] komaArvudeTabel = new long[2,3]; //luuakse uus kahemõõtmeline long massiiv, mõõtmete pikkused 2 ja 3, kokku kuus liiget


Massiivi loomisel võib kasutada võimalus mõõtmete pikkuste defineerimiseks läbi algväärtustamise. Näide

int[,] grid = { {5, 4, 3}, {2, 1, 0} };


Konkreetse massiivi liikme poole pöördumiseks tuleb kasutada massiivi nime ja õiget indeksit. Arvestada tuleb siinkohal, et liikmete indeksid algavad nullist, seega on massiivi esimene liige indeksiga null. Kindlasti tuleb arvestada, et pöördudes liikme poole, mida reaalselt ei eksisteeri, saadakse viga. Näide int[] taisArvud = new int[10]; taisArvud[0] = 45; // massiivi taisarvud esimesele liikmele omistatakse väärtus 45 taisArvud[10] = 11; // Tekib viga, sest massiivil taisArvud ei ole üheteistkümnendat liiget

  Massiivi mõõtmete pikkused Massiivide mõõtmete pikkuste kindlakstegemiseks on võimalik kasutada Length parameetrit ning GetLength meetodit. Näide int[] taisArvud = {2, 1, 0}; int pikkus = taisArvud.Length; // pikkus = 3

Kui mõõtmeid on mitu, siis annab parameeter Length teada kogu liikmete arvu massiivis, Rank annab teada mõõtmete arvu ning GetLength konkreetse mõõtme sügavuse. Näide

int[,] grid = { {5, 4, 3}, {2, 1, 0}

                    };

for(int i = 0; i < grid.Rank;i++)

     Console.WriteLine("Massiivi {0}. mõõde on pikkusega {1}", i+1,grid.GetLength(i));

//Selle koodi väljund: //Massiivi 1. mõõde on pikkusega 2 //Massiivi 2. mõõde on pikkusega 3


  Massiivi meetodid System.Array enimkasutatavateks meetoditeks on

  • Sort – sorteerib massiivi liikmed eeldusel, et liikmed on IComparable liides.

Näide

int[ ] data = {4,6,3,8,9,3}; // Sorteerimata System.Array.Sort(data); //Sorteeritud

  • Clear – tühjendab massiivi (ehk väärtustab massiivi liikmed väärtusega 0 või viitega null)

Näide

int[ ] data = {4,6,3,8,9,3}; System.Array.Clear(data, 0, data.Length); // data sisaldab nüüd {0,0,0,0,0,0}

  • Clone – see meetod loob uue massiivi ning kopeerib muutujate väärtused massiivist, mida kloonitakse. Kui massiivi liikmed sisaldavad viiteid, siis kopeeritakse viited, mitte objektid.

Näide

int[ ] data = {4,6,3,8,9,3}; int[ ] clone = (int [ ])data.Clone( );

  • IndexOf – see meetod tagastab esimese massiivi liikme, mis sisaldab otsitavat väärtus, indeksi. Kui otsitavat väärtus massiivis ei ole, siis tagastatakse -1.

Näide

int[ ] data = {4,6,3,8,9,3}; int where = System.Array.IndexOf(data, 9); // == 4

Massiivi meetodite pikema loetelu leiad siit: http://msdn.microsoft.com/en-us/library/system.array_members.aspx   System.Collection.Generic nimeruum System.Collection.Generic nimeruum sisaldab mitmeid liideseid ja klasse, mis defineerivad tüübikindlaid kollektsioone. Mitmed neist on kasutatavad samadel eesmärkidel kui massiivid, kuid pakuvad siinjuures suuremat paindlikkust. Kõik System.Collection.Generic nimeruumis leiduvad klassid ja liidesed on loetletud siin: http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx Lisaks võib vaadata ka System.Collection nimeruumi klasse ja liideseid: http://msdn.microsoft.com/en-us/library/system.collections.aspx

List(T) klass Realiseerib tüübikindla listi. List sarnaneb nii mõneski mõttes massiivile, kuid pakub võimalust liikmeid lisada ning eemaldada. Sisaldab muuhulgas meetodeid sorteerimiseks ja otsimiseks. Näide

List<string> nimed = new List<string>(); // luuakse list nimed, string tüüpi liikmetega nimed.Add("Jaan"); // lisatakse liige väärtusega „Jaan“ nimed.Add("Peeter"); nimed.Add("Sass"); nimed.Add("Ants"); nimed.Add("Kaur"); nimed.Add("Heiki"); nimed.Sort(); //sorteeritakse list foreach (string nimi in nimed)

    Console.WriteLine(nimi); //trükitakse konsooli listi liikme väärtus Console.WriteLine(nimed.ElementAt(1)); // tükitakse konsooli listi teise liikme väärtus

Lisalugemist: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx Queue(T) klass FIFO (first-in, first-out) tüüpi objektide kollektsioon. Sisuliselt on tegemist järjekorraga, kuhu on võimalik liikmed panna ning neid siis panemise järjekorras jälle välja võtta Näide

Queue<int> numbrid = new Queue<int>(); // luuakse uus järjekord numbrid.Enqueue(33); // lisatakse järjekorda 33 numbrid.Enqueue(22); // lisatakse järjekorda 22 Console.WriteLine(numbrid.Dequeue()); // võetakse järjekorrast liige ja trükitakse konsooli Console.WriteLine(numbrid.Dequeue());// võetakse järjekorrast liige ja trükitakse konsooli

Stack(T) klass Stack on LIFO (last-in, first-out) tüüpi objektide kollektsioon. Sisuliselt on tegemist pinu ehk magasintüüpi andmeobjektiga. See tähendab seda, et sinna viimasena lisatud liige võetakse välja esimesena. Näide

Stack<string> numbers = new Stack<string>(); // luuakse uus pinu numbers.Push("one"); // lisatakse pinusse „one“ numbers.Push("two"); numbers.Push("three"); numbers.Push("four"); numbers.Push("five");

//Pinu liikmed vaadatakse läbi ilma, et neid eemaldataks foreach( string number in numbers ) {

   Console.WriteLine(number);

}

Console.WriteLine("Popping '{0}'", numbers.Pop()); // võetakse välja viimasena sisestatud väärtus Console.WriteLine("Popping '{0}'", numbers.Pop());// võetakse välja eelviimasena sisestatud väärtus  

Koodinäited Õppetüki koodinäited

int[,] grid = { {5, 4, 3}, {2, 1, 0}

                           };
           for(int i = 0; i < grid.Rank;i++)
               Console.WriteLine("Massiivi {0}. mõõde on pikkusega {1}",
                   i+1,grid.GetLength(i));
           List<string> nimed = new List<string>();
           nimed.Add("Jaan");
           nimed.Add("Peeter");
           nimed.Add("Sass");
           nimed.Add("Ants");
           nimed.Add("Kaur");
           nimed.Add("Heiki");
           nimed.Sort();
           foreach (string nimi in nimed)
               Console.WriteLine(nimi);
           Console.WriteLine(nimed.ElementAt(1));
           Queue<int> numbrid = new Queue<int>();
           numbrid.Enqueue(33);
           numbrid.Enqueue(22);
           Console.WriteLine(numbrid.Dequeue());
           Console.WriteLine(numbrid.Dequeue());

  Sisestus int[] intMassiiv = new int[5];

               for (int index = 0; index <= 4; index++)
               {
                   Console.Write("Sisesta {0} arv: ", index + 1);
                   intMassiiv[index] = int.Parse(Console.ReadLine());
               }

Suurima leidmise näide int[] intMassiiv = new int[5];

               for (int index = 0; index <= 4; index++)
               {
                   Console.Write("Sisesta {0} arv: ", index + 1);
                   intMassiiv[index] = int.Parse(Console.ReadLine());
               }
               int suurim = intMassiiv[0];
               for (int index = 0; index <= 4; index++)
               {
                   if (intMassiiv[index] > suurim)
                       suurim = intMassiiv[index];
               }
               Console.WriteLine("Suurim on: {0}", suurim);