Post on 20-Feb-2020
Tablouri si Colectii
Definire tablou.
Tablouri unidimensionale, multidimensionale, de lungimivariabile (jagged arrays).
Colectii nongenerice
Colectii generice
Colectii specializate
Clasificare colectii
Spatiile de nume:
System.Collections;
System.Collections.Generic;
System.Collections.Specialized;
Tablouri - Arrays
• Tablourile au lungimea fixata. Primul element are indexul = 0 (zero).
• Exemplu declarare tablou unidimensional:
int[] numbers = new int[3];
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
Initializare in momentul crearii:
int[] nums = new int[3] { 1, 2, 3 };
string[] orase = new string[2] { "Iasi", "Botosani" };
Stabilire dimensiune:
int n = 10;
int[] sir = new int[n];
// class Persoana { … }
Persoana[] persoana = new Persoana[2];
Tablouri multidimensionale
• Tablou bidimensional (matrice cu 2 linii
si 3 coloane = 6 elemente):
int[,] nums = new int[2,3];
• Tablou cu 3 dimensiuni: 2*3*4 = 24
elemente:
int[,,] nums3 = new int[2,3,4];
Tablouri de tablouri (jagged arrays)
• Poate fi “vazut” ca un tablou cu o dimensiune in care fiecare element este la randullui un tablou cu o dimensiune.
• Exemplu:
• int[][] nums = new int[2][] {new int[2], new int[3]};
• // elementul nums[0] contine un tablou cu dimensiunea 2, etc.
• Reprezentarea vizuala ar putea fi aceasta:
0 1
----------
* *
* *
*
• Forma de apel:
nums[0][1] = 10;
int x = nums[0][1];
Definitie colectii
• Colectiile contin o grupare de
articole. Colectiile contin obiecte
(tipurile valoare sunt convertite la
tipuri referinta – boxing).
• Element = un articol al colectiei.
Clasificare colectii
• Dupa continut:– Liste de elemente;
– Liste de perechi (cheie, valoare).
• Dupa proprietati – ex:– Sortate
– Nesortate
• Sau– Colectii non-generice
– Colectii generice
– Colectii specializate
Colectii non-generice
• Spatiul de nume: System.Collections
• Clase de baza:
• CollectionBase: clasa de baza abstractapentru o colectie puternic tipizata.
• DictionaryBase: clasa de baza abstractapentru o colectie puternic tipizata de perechi(key, value).
• ReadOnlyCollectionBase: clasa de bazaabstracta pentru colectii non-generice, read-only si puternic tipizate.
Colectii non-generice
• Lista de elemente
• ArrayList: implementeaza interfata IList. Foloseste un tablou a carui dimensiune este modificata in mod dinamic.
ArrayList al = new ArrayList();
al.Add(“Colectie");
al.Add(“ArrayList");
al.Add(“ in .NET");
// scanare elemente
foreach(object o in al)
Console.Write(“ {0} “, o);
Colectii non-generice: ArrayList
• Metode uzuale – consultati MSDN
pentru sintaxa completa:
• Add, AddRange, Clear, Contains,
Insert, InsertRange, Remove,
ToArray, Reverse.
Colectii non-generice: BitArray
• BitArray: zona compacta de valori pe biti, reprezentati ca Boolean (true = bitul este 1; false = bitul este 0).
• Elementele pot fi accesate folosind un index (0 indexul primului element).
int[] nums = new int[3] { 1, 2, 3 };
BitArray ba = new BitArray(nums);
foreach (object o in ba)
Console.Write("{0} ", o);
Rezultat la BitArray
• Citeste de la drepta la stanga
• 1 ���� 0...01
• True False False False False False False False
• False False False False False False False False
• False False False False False False False False
• False False False False False False False False
• 2 ����0...010
• False True False False False False False False
• False False False False False False False False
• False False False False False False False False
• False False False False False False False False
• 3 ����0...011
• True True False False False False False False
• False False False False False False False False
• False False False False False False False False
• False False False False False False False False
Modificare BitArray
int[] nums = new int[3] { 1, 2, 3 };
BitArray ba = new BitArray(nums);
ba[3] = true;
foreach (object o in ba)
Console.Write("{0} ", o);
Rezultat BitArray: ba[3] = true;
• Citeste de la drepta la stanga
• 9 ���� 0...01001• True False False True False False False False
• False False False False False False False False
• False False False False False False False False
• False False False False False False False False
• 2 ����0...010
• False True False False False False False False
• False False False False False False False False
• False False False False False False False False
• False False False False False False False False
• 3 ����0...011
• True True False False False False False False
• False False False False False False False False
• False False False False False False False False
• False False False False False False False False
Colectii non-generice: BitArray
• Metode uzuale – consultati MSDN
pentru sintaxa completa:
• And, CopyTo, Get, Not, Or, Set,
SetAll.
Colectii non-generice: Queue
• Queue: colectie de obiecte si respecta FIFO (First In, First Out).
• Implementeaza colectia ca un tablou circular.
• Coada de mesaje din Windows respectaaceasta structura.
• Queue q = new Queue();
• q.Enqueue(“Mesaj:Desenare fereastra");
• q.Enqueue(“Mesaj:Afisare fereastra");
• q.Enqueue(“Mesaj:Inchide fereastra");
Colectii non-generice: Queue
• Metode uzuale – consultati MSDN
pentru sintaxa completa:
• Clear, Contains, Enqueue, Dequeue,
Peek, CopyTo, etc.
Clase non-generice: Stack
• Stack: colectie de obiecte si respecta
LIFO (Last In, First Out).
• Este implementat ca un buffer circular.
Stack ms = new Stack();
ms.Push(“1");
ms.Push(“0");
ms.Push(“1");
Clase non-generice: Stack
• Metode uzuale – consultati MSDN
pentru sintaxa completa:
• Clear, Contains, CopyTo, Peek, Pop,
Push.
Colectii non-generice
• Lista perechi (key, value):
• Hashtable: colectie de perechi(key,value), bazate pe codul hash al
cheii.
• SortedList: colectie de perechi(key,value) sortate dupa valoarea cheii
si accesibile prin cheie sau index.
Colectii non-generice: HashTable
• Fiecare element este o pereche (key,value) memorat intr-un obiectDictionaryEntry.
• Cheia nu poate fi null, valoarea poate fi.
• Obiectele folosite in cheie trebuie sa suprascrie metodeleObject.GetHashCode (sau interfata IHashCodeProvider) siObject.Equals (sau interfata IComparer).
• Obiectele folosite in cheie trebuie sa fie “immutable”.
• Un obiect este “immutable” daca starea acestuia nu poate fi modificatadupa ce a fost creat.
• Clasa System.String este “immutable”.
var imutabil = new { A = 2, B = 3 }; // creaza un obiect immutable
imutabil.A = 11; // eroare la compilare
Error 1 Property or indexer 'AnonymousType#1.A' cannot be assigned to -- it is read only …
Colectii non-generice: HashTable
• Exemplu
Hashtable ht = new Hashtable();
ht.Add(“IS", “Iasi");
ht.Add(“BT", “Botosani");
ht.Add(“SV", “Suceava");
ht.Add(“RegiuneaNE", “Iasi");
ht[“BC”] = “Bacau”; // proprietatea Item
• Parcurgerea colectiei se face astfel:
foreach( DictionaryEntry de in ht ) {
Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value); }
Observatie: cheile sunt unice, valorile pot fi duplicate.
Colectii non-generice: HashTable
• Obtinerea valorilor
ICollection values = ht.Values;
• Obtinerea cheilor
ICollection keys = ht.Keys;
• Observatie: Tipul pentru values si keys este celfolosit la crearea ht.
• Parcurgere colectie keys:
• foreach (string s in keys){ …}
Colectii non-generice: HashTable
• Metode uzuale – consultati MSDN
pentru sintaxa completa:
• Add, Clear, ContainsKey,
ContainsValue, CopyTo, Remove.
Colectii non-generice: SortedList
• Reprezinta o colectie de perechi (key, value) ce sunt sortate dupa cheie si suntaccesibile prin cheie sau index. Intern exista doua tablouri: unul pentru chei sialtul pentru valori.
• ExempluSortedList sl = new SortedList();
sl.Add(“Z", “Trei");
sl.Add(“Y", “Doi");
sl.Add(“X", “Unu");
Colectii non-generice: SortedList
• Parcurgere lista:
for ( int i = 0; i < sl.Count; i++ )
{
Console.WriteLine( "\t{0}:\t{1}", sl.GetKey(i),
sl.GetByIndex(i) );
}
Colectii non-generice: SortedList
• Metode uzuale – consultati MSDN
pentru sintaxa completa:
• Add, Clear, Contains, GetKeyList,
GetValueList, Count, Item, Keys, etc.
Colectii generice
• Spatiul de nume System.Collections.Generic
• Colectie tip lista de elemente:– HashSet<T>: o multime de obiecte fara elemente duplicate
– SortedSet<T> : obiecte ordonate
– LinkedList<T> : lista dublu inlantuita
– LinkedListNode<T> : un nod in LinkedList<T>
– List<T>
– Queue<T>
– Stack<T>
– SynchronizedCollection<T>: colectie “thread safe”.
– SynchronizedReadOnlyCollection<T>: RO, “thread safe”
• T reprezinta tipul din colectie
Colectii generice - Exemple
• List<int> li = new List<int>();
• li.Add(2);
• li.Add(10);
• List<Persoana> lp = new
List<Persoana>();
• Persoana p1 = new Persoana();
• lp.Add(p1); …
• Analog pentru Queue<T> si Stack<T>.
Colectii generice: LinkedList<T>
• Lista dublu inlantuita. Fiecare nod in obiectul LinkedList <T > estede tipul LinkedListNode <T >. Implementeaza interfata genericaICollection<T>
• Operatii
• Adaugare: ((ICollection<T>)lista).Add(T)– AddAfter(LinkedListNode<T>, T)
– AddAfter(LinkedListNode<T>, LinkedListNode<T>)
– AddBefore(LinkedListNode<T>, T)
– AddBefore(LinkedListNode<T>, LinkedListNode<T>)
– AddFirst(T), AddFirst(LinkedListNode<T>)
– AddLast(T), AddLast(LinkedListNode<T>)
• Eliminare element: Clear, Remove, RemoveFirst, RemoveLast
• Cautare: Find(T), FindLast(T)
• Proprietati: Count, First, Last
• Cererei booleene: Contains(T)
Colectii generice: LinkedList<T>
• Metode extinse (consultati MSDN):– All<T>,
– Any<T>(),
– AsParallel(),
– AsParallel<T>(),
– AsQueryable(), AsQueryAble<T>(),
– Concat<T>,
– Contains<T>(T),
– Distinct<T>(),
– First<T>(),
– GroupBy…
Colectii generice: LinkedList<T> -
Exemple
• LinkedList<int> lst = new LinkedList<int>(new int[5] { 4, 2, 5, 9, 7 });
• ((ICollection<int>)lst).Add(8); // trebuie cast
• lst.AddFirst(1);
• lst.AddLast(99);
• lst.AddLast(100);
• var query = lst.AsQueryable<int>();
• var max = lst.Max<int>();
• var items = from x in query //lst este de asemenea corect
• where (x%2 == 1 /*&& x > 10*/)
• orderby x
• select x;
• Console.WriteLine("\nNumere impare: Valoarea maxima in sir = {0}", max);
• foreach (int k in items)
• Console.WriteLine("{0} ", k);
• var itemc = lst.Contains<int>(99); // returneaza True sau False
• Console.WriteLine("Exista valoarea 99 in sir? {0}", itemc);
Colectii generice
• KeyedByTypeCollection<TItem>
– Colectie in care articolele sunt tipuri ce
servesc drept chei.
• Colectii tip perechi (key, value)
– Dictionary<T,U>
– SortedList<T,U>
– SortedDictionary<T,U>
Colectii generice : Dictionary<T,U>
Dictionary<string, string> di = new
Dictionary<string, string>();
di.Add(“Z", “Trei");
di.Add(“Y", “Doi");
di.Add(“X", “Unu");
– Iterarea elementelor:
• foreach( KeyValuePair<string, string> kvp in
di ) { Console.WriteLine("Key = {0}, Value =
{1}", kvp.Key, kvp.Value); }
Colectii generice : Dictionary<T,U>
: Operatii
• Adaugare: Add
• Stergere: Clear, Remove
• Cautare: ContainsKey,
ContainsValue
Colectii generice : SortedList<T,U>,
SortedDictionary<T,U>
• Colectie perechi (key, value) bazate
pe implementarea interfetei
IComparer<T>.
• Diferenta consta in timpul de
regasire al articolelor si al memoriei
ocupate. SortedList permite
regasirea informatiei si pe baza de
index.
Colectii generice: SortedList<T,U>
SortedList<string, string> sl = new SortedList<string, string>();
sl.Add(“Z", “Trei");
sl.Add(“Y", “Doi");
sl.Add(“X", “Unu");
Iterarea elementelor:
foreach( KeyValuePair<string, string> kvp in sl) { Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value); }
Iterarea valorilor:
IList<string> slValues = sl.Values;
foreach( string s in slValues ) { Console.WriteLine("Value = {0}", s); }
Regasire valoare prin index:
String s = sl.values[2];
Colectii generice:
SortedDictionary<T,U>
SortedDictionary<string, string> sd = new SortedList<string, string>();
sd.Add(“Z", “Trei");
sd.Add(“Y", “Doi");
sd.Add(“X", “Unu");
Iterarea elementelor:
foreach( KeyValuePair<string, string> kvp in sd) { Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value); }
Iterarea valorilor:
SortedDictionary<string, string>.ValueCollection sdValues = sd.Values;
foreach( string s in sdValues ) { Console.WriteLine("Value = {0}", s); }
SortedDictionary<string, string>.KeyCollection sdKeys = sd.Keys;
Etc.
Exercitii
• Se doreste sa se sorteze cheile
si/sau valorile continute intr-o
colectie generica Dictionary si sa se
afiseze in ordine crescatoare sau
descrescatoare.
Exercitii
• In cadrul aplicatiei Dv. memorati date in colectii de tip ArrayList, List<T>, Hashtable sau Dictionary<T,U>. Folositiaceste date pentru a personaliza aplicatia(de ex. aplicatia va sti la relansare punctulunde a fost oprita ultima data).
• Scrieti codul necesar pentru a realizaacest lucru, precum si o aplicatie de test.
• Indicatie: Vedeti documentatia din MSDN pentru serializarea obiectelor -SerializableAttribute.
Exercitii
• Se considera urmatorul tip:
public class Info
{ public Info(int n)
{ this.n = n; }
public int n = 0;
}
In cadrul unei aplicatii construiti o lista de obiecte de tip Data:
List<Info> numere = List<Info>();
Populati aceasta lista – minim 5 elemente. Fara a crea o alta lista scrieti codulce va aduna la fiecare element din lista valoarea 10. Testati. Veti afisaelementele adaugate in lista si apoi elementele modificate. Afisatielemetele ce contin numere impare in aceasta lista.
Indicatie: Vedeti Foreach.
Exercitii
• Implementati un tip ce va fi memorat ca elemente intr-un array sauArrayList si pentru care sa puteti folosi metodele: Array.Sort siArrayList.Sort pentru a realiza sortarea elementelor din array. Acest tip trebuie implementat astfel incat sa-l puteti folosi in SortedList.
• Exemplu:
class Segment {
int x1;
int y1;
int x2;
int y2;
//…
}
Acest tip poate fi sortat avand in vedere lungimea segmentului sau poate fiordonat dupa valorile unei perechi (x1, y1), etc.
Indicatie: Interfetele IComparable si IComparer.
Exercitii
• Implementati algoritmul HeapSort
pentru colectia List<int>.