Tablouri si Colectii Definire tablou. Tablouri unidimensionale, multidimensionale, de lungimi variabile (jagged arrays). Colectii nongenerice Colectii generice Colectii specializate Clasificare colectii Spatiile de nume: System.Collections; System.Collections.Generic; System.Collections.Specialized;
42
Embed
Tablouri si Colectii - Alexandru Ioan Cuza Universityiasimin/csharp/C2_2011 Tablouri si Colectii.pdf · Exercitii • In cadrul aplicatiei Dv. memorati date in colectii de tip ArrayList,
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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).
• 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
• 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.