fel
le

Lista

A lista az összetett adatszerkezetek családjába sorolható. Ennek megfelelően egyetlen lista típusú változóban egy időben több értéket is tudunk tárolni - ebben hasonlítanak a vektorokhoz. Abban is hasonlítanak, hogy minden egyes értéknek ugyanazon típusba kell tartoznia (ezt nevezzük a lista alaptípusának). Azonban van egy lényeges eltérés a lista és a vektorok között: a lista mérete dinamikusan változtatható.

Ezt úgy kell érteni, hogy míg a vektort létrehozásakor méretezni kell, fix méretre, és ezen méret nem változhat meg a későbbiek során - addig a listák létrehozásukkor üresek. Egy lista induláskor nulla elemet tárol, de később tetszőlegesen sok elemet lehet hozzáadni a listához. Több hozzáadási technika is létezik, a legegyszerűbb alkalmazása esetén az új elemek a lista végére kerülnek. A lista elemszáma nem végtelen, de gyakorlatilag több milliós elemszámmal is képes dolgozni. Ennél nagyobb elemszám esetén már nem szoktunk listát alkalmazni, helyette vagy hash táblát, vagy külső adattáblákat használunk.

Lista deklarációja

A lista típusú változó esetén használni kell a List kulcsszót, valamint meg kell adni a lista alaptípusát is. A lista alaptípusát kacsacsőrök (kisebb-nagyobb jelek) között kell feltüntetni:

List<double> szamok;
List<string> nevek;
List<bool> valaszok;
List<int> meresek;
 

Mivel a lista is referencia típuscsaládba sorolható, így ezek a változók mindegyike 4 byte memóriaigényű, egyetlen memóriacímet fognak tárolni, és kezdetben ez a memóriacím a nul.

Lista létrehozása

Mivel a lista típusú változók tényleges létrehozását, memóriafoglalását a new kulcsszóval kell végezni. A new után szokásosan meg kell adni (újra) kinek is kell helyet kialakítani. Ezt lista esetén még két gömbölyű zárójellel is meg kell toldani:

List<double> szamok   = new List<double>();
List<string> nevek    = new List<string>();
List<bool>   valaszok = new List<bool>();
List<int>    meresek  = new List<int>();
 

A listák egyelőre 0 elemet tárolnak, ezért gondolhatjuk azt is, hogy ez a helyfoglalás egyelőre jelképes. Ugyanakkor azt is tárolni kell, hogy jelenleg 0 elemű a lista (1 db int), valamint a listák háttérbeli működése miatt valójában kezdetben már valahány elemnek helyet is foglalunk, amely felhasználatlan területekre kerülnek majd az első listaelemek. Ezért ez a helyfoglalás valójában igenis érdembeli mennyiségű byte-ba kerül a memóriában.

1. ábra: A lista kezdetben
A két gömbölyű zárójel a generikus lista adattípus konstruktorának hívását jelöli ezen a ponton. A lista paraméter nélküli konstruktora is kiválóan alkalmas az alaphelyzetbe állításhoz, de a paraméteres változatokkal kifinomultabb kezdőállapotok is létrehozhatóak.

Listához elem hozzáadása

Mivel a lista kezdetben üres, első lépésként mindenképpen új elemet érdemes a listához hozzáadnunk. Ehhez, több lehetőségünk is van. Legegyszerűbb az .Add(..) függvény segítségével. Ennek során az új adat a lista végéhez kerül hozzáadásra. Ha a lista üres volt, akkor az első Add az első elemet adja a listához. E ponttól a lista egy elemű lesz, az egyetlen elem sorszáma 0 lesz. A következő Add a második elemet adja a listához, innentől 2 elemű lesz, a korábbi elem továbbra is 0, az új elem az 1-es sorszámot fogja megkapni.

2. ábra: A lista deklarációja és elem hozzáadás
szamok.Add( 12.4 );
szamok.Add( 45.8 );
nevek.Add( "Lajos" );
nevek.Add( "Géza" );
 
3. ábra: A lista két elem hozzáadása után

Lista elemek elérése

A lista elemszámát a Count tulajdonságával kérdezhetjük le (vektorok esetén a Length-t kellett használni). Ez általában is jellemző - aminek a mérete nem változik a futási idő alatt, annak Length-e van, aminek a mérete dinamikus, annak Count-ja.

A lista elemeinek indexe [0,Count-1] közöttiek. Ha a lista üres (kezdetben, Count=0), akkor nincs 0-s sorszámú eleme sem.

A lista i. elemét hasonló szintaktikával lehet elérni, mint vektorok esetén. A lista változó után szögletes zárójelben kell megadni az elem sorszámát.

double b = szamok[0] + szamok[1];
Console.WriteLine("A neve={0}", nevek[0]);
 

A lista nem konstansokat tartalmaz, a listaelemek nem csak kiolvashatóak, hanem módosíthatóak is (mint a vektorok esetén).

szamok[0] = 14.3;
szamok[1] = szamok[0]*2;
 

Lista feltöltése végjelig

Szokásos feladat, hogy számokat kérjünk be billentyűzetről, melyeket tároljunk és mentsünk el. A fő probléma a feladatban, hogy nem tudjuk előre, hogy hány számról lesz szó. Lehet ez 10 db, de akár 10.000 szám is. Ha nem ismert előre a darabszám, úgy nem tudunk vektort méretezni a feladathoz a bekérés előtt. Cserébe egy speciális értékkel jelzi a kezelő, hogy nincs már több szám hátra. Ebben előre meg kell állapodnunk melyik lesz ez a szám.

List<int> l = new List<int>();
 //
 Console.Write("Írd be a spec értéket:");
 int vegeErtek = int.Parse( Console.ReadLine() );
 //
 while (true)
 {
   Console.Write("Kérem a köv. értéket:");
   int x = int.Parse( Console.ReadLine() );
   if (x==vegeErtek) break;
   else l.Add( x );
 }
 

Lista feldolgozás FOR

Határozzuk meg egy egész számokat tartalmazó l lista elemeinek összegét, használjuk a for ciklust a megoldáshoz.

int sum = 0;
  for(int i=0;i<l.Count;i++)
  {
    sum = sum + l[i];
  }
  Console.WriteLine("Az összeg = {0}",sum);
 

Lista feldolgozás FOREACH

Határozzuk meg egy egész számokat tartalmazó l lista elemeinek összegét, használjuk a foreach ciklust a megoldáshoz.

int sum = 0;
  foreach(int x in l)
  {
    sum = sum + x;
  }
  Console.WriteLine("Az összeg = {0}",sum);
 
Hernyák Zoltán
2013-01-24 11:01:14