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 liidesega.

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 (ehk asukoha massiivis). 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);