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