ArrayList este o colectie simpla care poate stoca orice tip de obiect.
Clasa ArrayList este continuta in spatiul de nume System.Collections. Aceasta clasa ne permite sa construim un vector care sa creasca in marime, adaugand mereu elemente noi.
La declarare nu trebuie sa ii specificam marimea, fiind suficient doar :
//declare ArrayList lista = new ArrayList(); //Folosind metoda Add adugam obiecte, indiferent de tipul lor. //adaugam obiecte lista.Add("String"); lista.Add(3); lista.Add(5.65); //folosim iteratia pentru //parcurgerea listei foreach (object o in lista) { Console.WriteLine(o); } //proprietatea count //pentru a afla numarul de elemente //din lista Console.WriteLine("Lista are {0} obiecte", lista.Count);
Daca incercam o iteratie astfel, va fi aruncata o exceptie :
foreach (string s in lista) { Console.WriteLine(s); }
Unable to cast object of type 'System.Int32' to type 'System.String'.
Construim o lista de tip string si vom folosi metoda Sort pentru a o sorta alfabetic si Reverse pentru sortare inversa
ArrayList listaString = new ArrayList(); listaString.Add("def"); listaString.Add("ghi "); listaString.Add("abc"); listaString.Add("xyz"); listaString.Add(" "); //sortare in ordine alfabetica listaString.Sort(); foreach (object o in listaString) { //convertim in string Console.WriteLine(o.ToString()); } Console.WriteLine("----"); //sortare in ordine inversa listaString.Reverse(); foreach (object o in listaString) { Console.WriteLine(o.ToString()); }
Folosim metoda Remove pentru a sterge un obiect din lista.
//sterge un obiect //din lista lista.Remove("abc");
Pentru localizarea unui anumit element, apelam metoda BinarySearch si transmitem valoarea obiectului pentru a fi returnata pozitia obiectului in lista.
Console.WriteLine(listaString.BinarySearch("def"));
Putem folosi si metoda Contains care va returna o valoare de tip boolean ( daca lista contine sau nu contine elementul cautat).
Console.WriteLine(listaString.Contains("def"));
ArrayList si Array se aseamana foarte mult. Ambele permit stocarea unui numar mare de elemente.
ArrayList cu referinte
Vom crea o clasa Cont, cu 3 metode. Apoi vom construi obiecte pe baza ei si vom adauga referinte in ArrayList catre obiectele respective.
class Cont { private decimal sold = 0; //scade o suma din sold public bool RetrageSuma(decimal suma) { //daca nu sunt suficienti bani if (suma > sold) { return false; } else { sold = sold - suma; return true; } } //adauga suma la debit public void Depune(decimal suma) { sold = sold + suma; } //afiseaza soldul public decimal Sold() { return sold; } }
In Main:
//initial putem dam un parametru //dar poate pastra mai multe //sau mai putine elemente ArrayList conturi = new ArrayList(10); //creem instante ale clasei cont Cont student = new Cont(); Cont elev = new Cont(); //adaugam referinte conturi.Add(student); conturi.Add(elev);
Observatie : nu adaugam un Cont in lista, ci doar facem ca un element din lista sa indice catre un Cont. Deci, nu se adauga obiectul insusi, ci o referinta.
Cum accesem elementele ? Daca incercam astfel, cum suntem obisnuiti, vom avea eroare la compilare :
Cont c = conturi[0]; c.Sold();
Cannot implicitly convert type ‘object’ to ‘ContExemplu.Cont’. An explicit conversion exists (are you missing a cast?)
Motivul este ca ArrayList este o lista de Objects. Vom rezolva problema convertind la tipul Cont.
//facem conversie la Cont
Cont c = (Cont)conturi[0];
Console.WriteLine(c.Sold());
O lista cu membrii ArrayList se gaseste pe msdn.
Foarte asemanatoare cu ArrayList este clasa List, in plus avand avantajul de typesafe. Vom scrie despre aceasta clasa in articolul viitor.Exista si StringCollection, o colectie tipizata. Impreuna cu alte colectii din .Net care sunt strongly typed, aceste clase tipizate sunt usor de folosit in dezvoltare datorita faptului ca Visual Studio poate face automat validarea si nu mai e nevoie sa folosim conversia.
Codul folosit in exemplele anterioare:
Timotei Dolean says:
Mie nu-mi prea place ArrayList-ul ca nu e typesafe. Daca tot se vrea a fi folosit mai bine sa fie folosit DOAR pentru item-uri de tip referinta.
zeltera says:
Macar e mai bun decat…. array!
Pingback/Trackback
Colectii in .Net (exemple in limbajul c#) | by zeltera
irina says:
cum se rezolva problema cu sortarea alfabetica atunci cand se preia de la utilizator vectorul de stringuri? //Microsoft.VisualBasic.Interaction.Inputbox
zeltera says:
Nu stiu la ce te referi cand spui “vectorul de stringuri”, insa daca o colectie de obiecte (strings, in cazul tau), poti folosi obiecte din namespaceul collection pentru a face sortarea.
Nu am folosit Microsoft.VisualBasic.Interaction.Inputbox – nu prea am folosit VisualBasic – si nu stiu ce obtii de la acest control, insa daca obtii o colectie de strngs poti pune aceasta colectie intr-un obiect de tip ArrayList si folosi merodele de sortare din ArrayList.
Daca ai pune un exemplu ar fi mai usor sa raspund.