A Lista típust számos nyelvben ArrayList-nek (Tömb alapú lista) nevezik. Ez nem más, mint egy bővítési szempontból optimalizált tömb. A bővítési optimalizálás lényege, hogy ha van egy tömbünk, ami N elemet tárol és ehhez hozzá szeretnénk adni még egy elemet, akkor nem egy N+1 elem tárolására képes tömböt hozunk létre, hanem egy 2*N elem tárolására alkalmasat. Ilyen módon drasztikusan csökkenthető a memória töredezettsége és a felesleges másolások száma.
Előnye ennek a tárolási rendszernek, hogy dinamikusan bővíthető úgy, mint egy láncolt lista és mellette, mivel egy tömb, indexekkel hivatkozhatunk az egyes elemekre, így nem csak szekvenciálisan olvasható. A tárolási szerkezet hátránya, hogy ha nem jól választjuk meg a kezdő méretet, akkor a 2*N bővítés miatt a legrosszabb esetben N elem tárolásához a memóriában 2*N helyet foglal el.
A .NET lista implementációja nem meglepő módon a List<T> nevet kapta. A legfontosabb tulajdonságai és metódusai:
List(int capacity)
Paraméteres konstruktor. A paraméter a kiindulásként tárolni kívánt elemek számát adja meg.
List(IEnumerable<T> collection)
Paraméteres konstruktor. A lista elemei a paraméterként megadott IEnumerable felületet implementáló osztály elemei lesznek.
int Capacity { get; set; }
Lekérdezi vagy beállítja a tárolandó elemek számát. A tárolandó elemek száma nem azonos a ténylegesen tárolt elemek számával. Ez a tulajdonság a belső tömb méretét kérdezi le, vagy állítja be.
void Add(T item)
Hozzáad egy elemet a listához.
void AddRange(IEnumerable<T> collection)
Hozzáadja egy IEnumerable<T> interface-t megvalósító osztály összes elemét a listához.
void Sort()
Sorba rendezi a lista elemeit. A sorba rendezés feltétele egy típus esetén, hogy rendelkezzen az adott típus az összehasonlító operátor megfelelően felüldefiniált változatával, vagy implementálja a IComparable<T> interface-t.
void Reverse()
A Lista elemeinek sorrendjét megfordítja.
T[] ToArray()
A lista elemeit visszaadja egy tömbben.
void TrimExcess()
Átméretezi a listát úgy, hogy csak annyi elemnek foglaljon helyet, mint amennyi ténylegesen el van foglalva.
A Lista típus elemei ugyanúgy indexelhetőek, mint egy tömb elemei. Túlindexelés vagy alul indexelés esetén szintén kivételt kapunk:
var lista = new List<int>();
lista.Add(33);
lista.Add(44);
lista.Add(55);
var x = lista[1];
var y = lista[33]; //hiba
Az alábbi példaprogram a List osztály használatát mutatja be:
using System;
using System.Collections.Generic;
namespace PeldaList
{
class Program
{
static void Main(string[] args)
{
//4 elemnek foglalunk helyet
var lista = new List<int>(4);
lista.Add(9);
lista.Add(2);
lista.Add(4);
lista.Add(5);
Console.WriteLine("A lista elemei:");
foreach (var elem in lista)
{
Console.WriteLine(elem);
}
lista.Sort(); //int esetén implementálva van a < és > reláció
Console.WriteLine("A lista elemei sorbarendezés után:");
foreach (var elem in lista)
{
Console.WriteLine(elem);
}
//+1 elem. Itt átméretezés lesz.
//2n alapján a méret 8-ra fog nőni.
//ez jelen esetben 3*4 byte feleslegesen foglalt memória
lista.Add(99);
Console.WriteLine("Lista mérete: {0}", lista.Capacity);
lista.TrimExcess(); //felesleges foglalás csökkentése
Console.WriteLine("Átméretezés után: {0}", lista.Capacity);
Console.ReadKey();
}
}
}
A program kimenete:
A lista elemei:
9
2
4
5
A lista elemei sorbarendezés után:
2
4
5
9
Lista mérete: 8
Átméretezés után: 5