Documente Academic
Documente Profesional
Documente Cultură
12/7/2013
ArrayList: O colectie simpla, bazata pe indecsi, redimensionabila Queue: O coada Stack: O stiva Hashtable: O colectie de perechi nume/valoare SortedList: O colectie sortata de perechi nume/valoare ce permite si acces cu index ListDictionary: Lista eficienta pentru un numar mic de intrari, asemanatoare cu hashtable
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
HybridDictionary: foloseste ListDictionary pentru numar mic de intrari si Hashtable pentru numar mare de intrari. OrderedDictionary: Hashtable in care putem defini propriul mod de organizare a datelor; accepta acces cu index StringCollection: ArrayList de stringuri StringDictionary: Hashtable de stringuri NameValueCollection: Hashtable ce pemite mai multe valori / cheie si acces pe baza de index
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
Se folosesc metodele Add si Remove Mai exista: AddRange, InsertRange, Clear, IndexOf, Contains
ArrayList an = new ArrayList(); an.Add(ana); ad.Add(MERE); ad.Remove(ana);
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
AddRange: adauga mai multe elemente la finalul unei colectii Insert: Adauga un element la o anumita pozitie in colectie InsertRange: Adauga mai multe elemente la o pozitie intr-o colectie RemoveAt: Sterge elementul din o colectie de la o anumita pozitie RemoveRange: Sterge mai multe elemente dintr-o colectie Clear: Sterge toate elementele dintr-o colectie IndexOf: Gaseste pozitia unui element intr-o colectie Contains: Verifica daca o colectie contine un element
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
Folosind un enumerator
Majoritatea colectiilor in c# suporta un enumerator prin mostenirea interfetei IEnumerable si implementarea metodei GetEnumerator() care returneaza un IEnumerator IEnumerator contine:
Metoda MoveNext: Trece la urmatorul element din lista. Putem folosi valoarea intoarsa pentru a vedea daca am ajuns la finalul colectiei Metoda Reset: Ne pozitionam la inceputul colectiei Proprietatea Current: Elementul pe care suntem pozitionati cu enumeratorul in lista
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
Exemplu enumerator:
ICollection:
O clasa care mosteneste ICollection implementeaza toate metodele din IEnumerable si contine in plus:
Count IsSyncronized SyncRoot CopyTo
IList:
IList extinde ICollection si adauga urmatoarele:
Proprietati: IsFixedSize, IsReadOnly, Item Metode: Add, Clear, Contains, IndexOf, Insert, Remove, RemoveAt
12/7/2013
Pentru a putea fi sortata, o colectie implementeaza IComparable ce impune metoda CompareTo() ce returneaza un int:
< 0: parametrul din stanga mai mic decat cel din dreapta = 0: parametri sunt egali > 0: parametrul din stanga mai mare decat cel din dreapta
ArrayList are metoda Sort care sorteaza lista. Implicit sortarea este crescatoare. Daca dorim sa sortam dupa alt criteriu sau tipuri create de noi, vom folosi clasa Comparer, implementarea default a IComparer, ce impune metoda Compare(object, object).
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
CaseInsensitiveComparer comp = new CaseInsensitiveComparer(); public int Compare(object x, object y) { return comp.Compare(y,x); } } lista.Sort(new ComparatorDescrescator());
12/7/2013
10
Coada: Reprezentata de clasa Queue. Folosim metodele Dequeue pentru scoatere din coada, Enqueue pentru punere in coada si Peek pentru a accesa elementul din varful cozi. Proprietatea Count ne spune numarul de elemente din coada. Stiva: Reprezentata de clasa Stack Metode: Pop, Peek, Push Proprietati: Count
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
11
Ex: Hashtable
Hashtable h = new Hashtable(); h.Add(viprad@yahoo.com ,Victor); h[key]=10; Console.WriteLine(h[viprad@yahoo.com|);
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
12
Pentru a parcurge un dictionar vom folosi un enumerator sau, mai simplu, constructia foreach. Un dictionar e format din mai multe intrari DictionaryEntry In consecinta, iterarea printr-un dictionar se va face:
foreach (DictionaryEntry d in dictionar) { Console.WriteLine(d.Value);}
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
13
Toate clasele dictionar implementeaza interfata IDictionary ce mosteneste ICollection. (deci orice dictionary va fi enumerabil) Interfata IDictionary este foarte asemanatoare cu IList, diferenta principala fiind ca elementele se acceseaza dupa o cheie, nu dupa index.
12/7/2013
14
Un hashtable este un dictionar care foloseste valori intregi numite hash-uri pentru a stoca cheile. Astfel el va folosi metoda GetHashCode() din clasa Object. Un Hashtable are, pe langa metodele din IDictionary si metodele ContainsKey si ContainsValue.
12/7/2013
15
12/7/2013
16
Pentru a testa egalitatea a doua chei, un Hashtable foloseste in prima instanta metoda GetHashCode() mosteninta de la clasa Object Daca tipul obiectului cheie in Hashtable este mai complex (altul decat string, int, de ex) pot sa apara comportamente ce pot fi considerate anormale
12/7/2013
17
public class Nume { public string nume; public Nume(string nume) { this.nume=nume; } } Hashtable hash = new Hashtable(); Nume n1 = new Nume(ion); Nume n2 = new Nume(ion); hash[n1] = Ion; hash[n2] = Ion
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
18
In acest moment hash.Count == 2, din cauza ca GetHashCode va intoarce un cod diferit pentru fiecare instanta a clasei Nume. Pentru a rezolva aceasta problema trebuie sa facem este sa suprascriem functia GetHashCode din clasa Nume in urmatorul fel:
public override int GetHashCode() { return nume.GetHashCode(); } Stringurile vor avea acelasi hashcode, deci in acest moment hash.Count == 1;
12/7/2013
19
Daca nu doriti sa schimbati clasa pentru a verifica egalitatea puteti implementa un IEquityComparer ce probeaza egalitatea in afara clasei. IEquityComparer este similar interfetei IComparer. IEquityCompare contine 2 metode: GetHashCode() si Equals()
12/7/2013
20
public class NameCompare: IEquityComparer { public int GetHashCode(object obj) { return ( ((Nume)obj).nume)GetHashCode(); } public bool Equals(object x, object y) { return ( ( (Nume)x).nume == ((Nume)y).nume ); } } Hashtable h = new Hashtable(new NameCompare());
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
21
O SortedList este un dictionar in care elementele sunt sortate automat. Din acest motiv vom putea accesa elementele din el in ordine (constructia foreach le va parcurge in ordine crescatoare a cheilor). Avem la dispozitie metode precum GetKey, GetByIndex sau IndexOfKey prin care putem accesa si modifica elementele din acest tip de dictionar prin chei. Putem specifica in constructorul dictionarului o clasa ce implementeaza IComparer pentru a face sortarea altfel decat crescator (ca la metoda Sort()).
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
22
12/7/2013
23
Platforma .NET contine clasele BitArraysi BitVector32 care faciliteaza lucrul pe biti. BitArray este o colectie redimensionabila ce contine valori Boolean si suporta operatii precum And, Or, Nor sau Xor. BitVector32 contine un intreg pe 32 de biti, pe care il putem modifica pe bit. Nu este redimensionabil.
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
24
25
BitVector32 contine intregi pe 32 de biti, a caror valoare poate fi extrasa oricand din colectie prin folosirea proprietatii Data. Putem crea masti (pentru a modifica individual fiecare bit):
ex: BitVector32 vector = new BitVector32(121); int primulBit = BitVector32.CreateMask(); int alDoileaBit = BitVector32.CreateMask(primulBit); vector[primulBit]=true; vector[alDoileaBit]=true;
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
26
Putem folosi BitVector32 pentru impachetare si despachetare de date (putem scrie o data de exemplu intr-un singur intreg pe 4 biti). Pentru a impacheta si despacheta trebuie sa construim sectiuni de mai multi biti din BitVector32. ex: BitVector32.Section s1 = BitVector32.CreateSection(31); BitVectore32.Section s2 = BitVector32.CreateSection(12, s1); BitVector32. Section s3= BitVector32.CreateSection(5000,s2); BitVector32 vector = new BitVector32(0); vector[s1]=12; vector[s2]=4; vector[s3]=2006;
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
27
StringCollection este ArrayList ce lucreaza numai cu stringuri. StringDictionary este un dictionar obisnuit, dar in care cheile si valorile sunt stringuri.
12/7/2013
28
Clasa CollectionsUtil ne faciliteaza creearea unui HashTable sau a unei SortedList care sa fie case insensitive prin metoda statica CollectionsUtil.CreateCaseInsensitive[Hashtable,Sor tedlist] ex: Hashtable hash = CollectionsUtil.CreateCaseInsensitiveHashtable();
29
Asemanatoare cu StringDictionary (cheile si valorile trebuie sa fie stringuri). Permite existenta mai multor valori la o singura cheie (metoda GetValues(key)); Valorile pot fi extrase atat dupa cheie cat si dupa index.
12/7/2013
30
NameValueCollection nmc = new NameValueCollection(); nmc.Add(Key,Value1); nmc.Add(Key,Value2); foreach (string s in nmc.GetValues(Key)) { Console.WriteLine(s); }
31
TYPESAFE!!! Asigura viteza si siguranta Pentru orice colectie normala exista una generica echivalenta Foarte asemanatoare cu colectiile din C++ STL
12/7/2013
32
NameValueCollection DictionaryEntry
StringCollection StringDictionary N/A
12/7/2013
Dictionary<> NameValuePair<>
List<string> Dictionary<string> LinkedList<>
33
Clasa List<> poate fi folosita pentru a creea foarte usor liste de obiecte. Exista toate metodele si proprietatile din ArrayList. List<int>intregi = new List<int>(); intregi.Add(1); intregi.Add(2); //EROARE foreach (int i in intregi) { Console.WriteLine(i); }
12/7/2013
34
Pentru sortare si aici folosim metoda Sort(); Metoda sort la generice primeste ca parametru un delegat generic de comparare. Un delegat generic de comparare:
public delegate int Comparare<Tip>( Tip x, Tip y );
12/7/2013
35
12/7/2013
36
Dictionarul generic inlocuieste majoritatea dictionarelor negerice. Singura diferenta importanta in folosire apare la enumerare. In loc de DictionaryEntry vom folosi clasa KeyValuePair.
ex: Dictionary<string, int> dictionar = new Dictionary<string,int>(); dictionar[unu]=1; dictionar.Add(doi,2); foreach (KeyValuePair<string,int> i in dictionar) { Console.WriteLine({0] = {1}, i.Key, i.Value); }
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
37
Foarte asemanatoare cu Dictionary<>, numai ca datele vor fi sortate automat. Se folosesc identic cu Dictionary<>
12/7/2013
38
Contine implementarea unei liste dublu inlantuite. Ofera metode ca: AddAfter, AddBefore, AddFirst, AddLast, Find, FindLast, Remove, RemoveFirst, RemoveLast O LinkedList contine mai multe LinkedListNode. Un LinkedListNode are urmatoarele proprietati:
List: LinkedList din care apartine Next: Urmatorul nod din LinkedList Previous: Nodul anterior din LinkedList Value: Valoarea din LinkedListNode
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
39
40
Fiecare interfata ce era mostenita de nongenerice are un corespundent generic: IList, IEnumerable, etc. List<string>.Enumerator e = lista_de_stringuri.GetEnumerator();
while (e.MoveNext()) { string s = e.Current; }
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
41
Pentru clasele IComparer si IEqualityComparer exista corespondente generice. Acestea sunt IComparer<> si IEqualityComparer<>. Ele sunt pot fi mostenite si implementate exact ca si echivalentele nongenerice.
ex: class Comprator<int>: IComparer<int> { public override int Compare(int x, int y) { return x.GetHashCode()-y.GetHashCode(); } }
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu
42
Sa se realizeze o aplicatie care parcurge in mod recursiv un director de pe disc (specificat de catre utilizator) si care realizeaza un dictionar SORTAT in ordine invers alfabetica a cheilor. Fiecare intrare in dictionar va reprezenta o stiva de nume de fisiere asociata unei extensii Se va parcurge dictionarul si respectiv stivele fiecarui tip de extensie, afisandu-se lista de extensii cu fisierele corespunzatoare Obs: Se vor folosi DOAR colectii generice, specifice fiecarui tip de intrare Elementele din dictionar vor fi identificate dupa o cheie de tip string, corespunzatoare extensiei