Sunteți pe pagina 1din 43

4

12/7/2013

C3 .NET ADF - (C) Victor Adrian Prisacariu

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 for simplu


for (int i=0;i<lista.Count;i++) { }

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:

IEnumerator enumerator = lista.GetEnumerator(); While (enumerator.MoveNext()) {


Console.WriteLine(enumerator.Current);

foreach foloseste enumerator-ul pentru a parcurge (itera) o colectie


12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu

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

L3 .NET ADF - (C) Victor Adrian Prisacariu

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

ex: Comparatorul CaseInsensitiveComparer


lista.Sort(new CaseInsensitiveComparer());

ex: sortarea descrescatoare: public class ComparatorDescrescator: IComparer


{

CaseInsensitiveComparer comp = new CaseInsensitiveComparer(); public int Compare(object x, object y) { return comp.Compare(y,x); } } lista.Sort(new ComparatorDescrescator());

12/7/2013

L3 .NET ADF - (C) Victor Adrian Prisacariu

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

Clasele Dictionary in .NET sunt o colectii de perechi nume/valoare.

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

L3 .NET ADF - (C) Victor Adrian Prisacariu

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

L3 .NET ADF - (C) Victor Adrian Prisacariu

15

12/7/2013

L3 .NET ADF - (C) Victor Adrian Prisacariu

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

L3 .NET ADF - (C) Victor Adrian Prisacariu

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

L3 .NET ADF - (C) Victor Adrian Prisacariu

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

L3 .NET ADF - (C) Victor Adrian Prisacariu

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

Pe langa Hashtable si SortedList .NET mai contine urmatoarele tipuri de dictionare:


ListDictionary: Hashtable recomandat pentru colectii mici de pana in 10 elemente HybridDictionary: se comporta initial ca un ListDictionary, insa pe masura ce nr. Elementelor colectiei creste, devine un HashTable OrderedDictionary: HashTable ce permite acces pe baza de index

12/7/2013

L3 .NET ADF - (C) Victor Adrian Prisacariu

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

BitArray bits = new BitArray(3); bits[0]=false; bits[1]=true; bits[2]=false;

Putem executa operatii intre 2 bitarray-uri:


BitArray b2 = new BitArray(2); bits[0]=true; bits[1]=true; bits[2]=false; BitArray bitsxorb2 = bits.Xor(b2);
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu

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

L3 .NET ADF - (C) Victor Adrian Prisacariu

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();

12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu

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

L3 .NET ADF - (C) Victor Adrian Prisacariu

30

NameValueCollection nmc = new NameValueCollection(); nmc.Add(Key,Value1); nmc.Add(Key,Value2); foreach (string s in nmc.GetValues(Key)) { Console.WriteLine(s); }

OBS: nmc[Key]=Value1; nmc[Key]=Value2; O singura valoare va fi memorata la cheia Key.


12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu

31

TYPESAFE!!! Asigura viteza si siguranta Pentru orice colectie normala exista una generica echivalenta Foarte asemanatoare cu colectiile din C++ STL

12/7/2013

L3 .NET ADF - (C) Victor Adrian Prisacariu

32

Echivalenta intra colectii normale si colectii generice


ArrayList Queue Stack Hashtable SortedList ListDictionary HybridDictionary OrderedDictionary SortedDictionary List<> Queue<> Stack<> Dictionary<> SortedList<> Dictionary<> Dictionary<> Dictionary<> Dictionary<>

NameValueCollection DictionaryEntry
StringCollection StringDictionary N/A
12/7/2013

Dictionary<> NameValuePair<>
List<string> Dictionary<string> LinkedList<>

L3 .NET ADF - (C) Victor Adrian Prisacariu

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

L3 .NET ADF - (C) Victor Adrian Prisacariu

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 );

ex: pentru sortarea unei liste de intregi in ordine inversa:


static int SortareInversaInt(int x, int y) { return y-x; } intregi.Sort(SortareInversaInt);

12/7/2013

L3 .NET ADF - (C) Victor Adrian Prisacariu

35

Coada si stiva generica sunt identice cu cele non-generice in modalitatea de folosire.

ex: Queue<string> coada = new Queue<string>(); coada.Enqueue(ana);

12/7/2013

L3 .NET ADF - (C) Victor Adrian Prisacariu

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

L3 .NET ADF - (C) Victor Adrian Prisacariu

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

Putem folosi LinkedList in urmatorul fel:


Se pot folosi AddFirst, AddLast pentru a adauga noduri in lista la inceput sau la final Putem folosi AddBefore si AddAfter pentru a adauga noduri in lista dupa sau inainte de un nod deja existent Putem folosi foreach pentru a itera prin lista. ex: LinkedList<int>lista = new LinkedList<int>(); LinkedListNode<int>primul = lista.AddFirst(1); lista.AddFirst(2); lista.AddAfter(primul, 3); foreach (int i in lista) Console.WriteLine(i);
12/7/2013 L3 .NET ADF - (C) Victor Adrian Prisacariu

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

S-ar putea să vă placă și