14. Lista adattípus

A lista olyan adatszerkezet, amely azonos típusú - azonos méretű - adatokból áll. Ebben hasonlít a tömbökhöz, de vannak különbségek. A tömbök elemeinek elérése csak az indexeken keresztül történik, de a lista elemeinek elérése más fajta is lehet.

Magyarázat

A C#-ban kétféle lista létezik:
  1. A tömbön alapuló listák. Az egyszerűbbek hátterében tulajdonképpen tömb található, ezért sok esetben hasonlóan lehet kezelni őket, mint a tömböket. Ezzel fogunk részletesebben foglalkozni.
  2. A láncolt listák. Elemei két részből állnak, az adatot tároló részből és egy mutatós részből. Minden listának van egy listafeje. Ez a lista legelső eleme. A lista következő eleme érhető csak el. Ha a lista utolsó eleméhez értünk, akkor nem tudunk tovább menni.
    Ha a listából törlünk egy elemet, akkor ott a memóriában lesz egy "lyuk" és a következő elemre mutatót át kell állítani.
    Listafej: 1
Adat 2 Másik adat 4 ----- 0 adat 5 Adat 0

Ebben a példában a listafej az első elemre mutat, az első elem a 2. elemre, a második elem mutatója pedig a 4. elemre, és így tovább. A harmadik elem üres.

C# lista létrehozása, majd bejárása

A lista létrehozása megadott típusú adatokból:

List<Típus> = new List<Típus>();  (röviden List<T>)

Van a listáknak tárolómérete, (kapacitás=> angolul Capacity). Ez azt jelenti, hogy különösebb háttér tevékenység nélkül hány elemet képes befogadni a lista. Ez alapesetben 4. Ha módosítani akarjuk az értéket, mondjuk 8-ra, akkor a definíciónál így kell eljárni:

List<Típus> = new List<Típus>(8);

Ha a lista eredeti kapacitása megtelik, akkor a következő elem hozzáadásakor a kapacitás méretével megnöveli a tárolóhely nagyságát, azaz plusz memóraterületet foglal le. Ez nagy méretű adattípus használatakor viszonylag sokáig tarthat, ez lassíthatja a program futását. Általában a Capacity-vel egy átlagos programozónak nem kell törődnie!

Listák esetén szükségünk van a System.Collections.Generic névtérre!

Megjegyzés:
A listák a tömbökhöz képest okosabb adatszerkezetek, mert a lista elemei lehetnek bármilyen típusok, akár tömbök is.

A lista feltöltése adatokkal általában a hagyományos for ciklussal történhet.

Amikor a lista adatait fel akarjuk dolgozni, haszálhatnánk hagyományos ciklust is és indexeket, de természetesebb a foreach ciklust használni,

foreach ciklus

foreach (típus változó in lista)
{
    változó feldolgozása
}

Az alábbi példában létrehozunk és feltöltünk 10 db véletlen számmal egy listát, majd sorban kírjuk a konzolra

using System;
using System.Collections.Generic;     //Ezt itt be kell tennünk!!!!
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> lista = new List<int>();  // Egész típusú értékekből álló lista
            Random rnd = new Random();          // Véletlen számok létrehozása
            for (int i = 0; i < 10; i++)        // 10 elemmel töltöm fel a listát
            {
                lista.Add(rnd.Next(10, 100));
            }

            foreach (int ertek in lista)            //végigmegyünk a lista elemein
            {
                Console.Write("{0}, ", ertek);      //Kiiratjuk sorban a lista elemeit
            }
        }
    }
}

A C#-ban a listák is Objektumok, ezért vannak adattagjai és metódusai is. Az alábbiakban a leggyakrabban használt elemeket nézzük meg:

A listák esetén hivatkozhatunk az elemre az elem sorszámával. pl. lista[12]. Ilyen módon a fenti kírás mehetett volna így is:

Listákhoz tartozó tulajdonságok

  • lista.Capacity - Le tudjuk kérni a tárolóméret nagyságát. Ez nem azonos az elemszámmal!
  • lista.Count - a lista elemeinek aktuális száma. Ezt használhatjuk hagyományos ciklus esetén is.
for(int i=0; i< lista.Count; i++ )          //végigmegyünk a lista elemein
{
    Console.Write("{0}, ", lista[i]);       //Kiiratjuk sorban a lista elemeit
}

Listák metódusai

  • lista.Add(adat) - Új adat hozzáadása a lista végéhez.
  • lista.Insert(hova, érték) - A lista megadott sorszámú helyére tudunk beszúrni új adatot.
  • lista.Remove(érték) - A listából kitörli a megadott értékű elemet. Ilyenkor a listában lesz egy "lyuk", amit a háttér rendszer automatikusan lekezel, de a memóriahely nem fog felszabadulni!
  • lista.RemoveAt(index) - A megadott indexű elemet töröljük ki a listából. A törlésre vonatkozó dolgok itt is érvényesek lesznek. Ha olyan adatot törlünk ki, amelynek indexe nagyobb, mint az elemszám, akkor kivételt dob a program (exception).
  • lista.Clear() - törli a lista összes elemét.
  • lista.AddRange(tomb) - Egy tömb elemeit hozzámásolja a lista végére
  • lista.Sort() - Érték szerint rendezi a lista elemeit. Egyszerű adattípusoknál működik.
  • lista.Contains(érték) - Igaz vagy hamis értéket ad vissza attól függően, hogy létezik-e az elem a listában.
  • lista.BinarySearch(érték) - a keresett elem indexét adja vissza

Ezt a témát az alábbi helyen találod meg részletesebben: Csharpkönyv 31. oldal

Mintaprogram: fz_lista.zip