C# : tableaux, collections, énumérations et boucles
Achref El Mouelhi
Docteur de l’université d’Aix-Marseille
Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel
[Link]@[Link]
H & H: Research and Training 1 / 38
Plan
1 Introduction
2 Les tableaux
3 Les collections
4 Les collections génériques
Les listes
Les tableaux vs les listes
Un tableau ou une liste multi-type ?
Les dictionnaires
Les piles
5 Les énumérations
6 Les boucles
H & H: Research and Training 2 / 38
Introduction
Introduction
Les boucles et les ensembles de valeurs
Les boucles simplifie l’écriture d’un bloc de code qui se répète
dans un programme
for, foreach et .ForEach que pour les ensembles
while
do ... while
Une variable permet de stocker une seule valeur à la fois. Mais il
existe d’autres structures en C# qui permettent de stocker
plusieurs valeurs telles que
Les tableaux
Les collections
Les énumérations
H & H: Research and Training 3 / 38
Introduction
Introduction
Dans ce cours
La famille for sera traitée dans les différentes sections sur les
ensembles
while et do ... while dans la dernière section
H & H: Research and Training 4 / 38
Les tableaux
Les tableaux
Les tableaux, c’est quoi ?
une variable
contenant un ensemble de valeurs
du même type
et dont le nombre (de valeurs) est fixé à la déclaration
H & H: Research and Training 5 / 38
Les tableaux
Les tableaux
Déclaration
type[] nomTableau = new type[nbrElement];
H & H: Research and Training 6 / 38
Les tableaux
Les tableaux
Déclaration
type[] nomTableau = new type[nbrElement];
Exemple
int[] tab = new int[3];
H & H: Research and Training 6 / 38
Les tableaux
Les tableaux
Déclaration
type[] nomTableau = new type[nbrElement];
Exemple
int[] tab = new int[3];
H & H: Research and Training 6 / 38
Les tableaux
Les tableaux
Déclaration
type[] nomTableau = new type[nbrElement];
Exemple
int[] tab = new int[3];
Utilisation
Tous les éléments du tableau sont initialisés à 0.
tab[i] : permet d’accéder à l’élément d’indice i du tableau
Le premier élément d’un tableau est d’indice 0.
On ne peut dépasser la taille initiale d’un tableau ni changer le
type déclaré.
H & H: Research and Training 6 / 38
Les tableaux
Les tableaux
Déclaration + initialisation
int[] tab = new int[] { 3, 5, 4 };
H & H: Research and Training 7 / 38
Les tableaux
Les tableaux
Déclaration + initialisation
int[] tab = new int[] { 3, 5, 4 };
On peut aussi utiliser le raccourci suivant
int[] tab = { 3, 5, 4 };
H & H: Research and Training 7 / 38
Les tableaux
Les tableaux
Déclaration + initialisation
int[] tab = new int[] { 3, 5, 4 };
On peut aussi utiliser le raccourci suivant
int[] tab = { 3, 5, 4 };
Cette écriture déclenche un IndexOutOfRangeException
tab[3] = 2;
H & H: Research and Training 7 / 38
Les tableaux
Les tableaux
Parcourir un tableau avec un for
for (int i = 0; i < [Link]; i++)
[Link](tab[i]);
H & H: Research and Training 8 / 38
Les tableaux
Les tableaux
Parcourir un tableau avec un for
for (int i = 0; i < [Link]; i++)
[Link](tab[i]);
Parcourir un tableau avec un foreach
foreach (int n in tab)
{
[Link](n);
}
H & H: Research and Training 8 / 38
Les tableaux
Les tableaux
Déclaration d’un tableau à deux dimensions
type[,] nomTableau = new type[nbLignes, nrColonnes];
Déclaration + initialisation
int[,] tab2dim = new int[,]
{
{1, 2},
{3, 4}
};
Ou
int[,] tab2dim =
{
{1, 2},
{3, 4}
};
H & H: Research and Training 9 / 38
Les tableaux
Les tableaux
Parcourir un tableau à deux dimensions
foreach (int n in tab2dim)
{
[Link](n);
}
H & H: Research and Training 10 / 38
Les tableaux
Les tableaux
Parcourir un tableau à deux dimensions
foreach (int n in tab2dim)
{
[Link](n);
}
Ou
for (int i = 0; i <2; i++)
for (int j = 0; j < 2; j++)
[Link](tab2dim[i,j]);
H & H: Research and Training 10 / 38
Les tableaux
Les tableaux
Parcourir un tableau à deux dimensions
foreach (int n in tab2dim)
{
[Link](n);
}
Ou
for (int i = 0; i <2; i++)
for (int j = 0; j < 2; j++)
[Link](tab2dim[i,j]);
Ne pas confondre tab[,] avec tab[][] qui veut dire un tableau de
tableaux.
H & H: Research and Training 10 / 38
Les tableaux
Les tableaux
Trier un tableau (unidimensionnel)
[Link](tab);
Autres opérations sur les tableaux
[Link](tab, n, m) : supprime les m valeurs (et non
pas les éléments) du tableau en commençant par l’élément
d’indice n. (il existe aussi reverse pour inverser l’ordre,...)
[Link](tab, n)) : retourne l’indice de la première
apparition de la valeur n dans le tableau tab. (il existe aussi
LastIndex, Exists...)
[Link](ref tab, n) : réduit le nombre d’élément de
tab au n premier élément
...
H & H: Research and Training 11 / 38
Les collections
Les collections
Les collections, c’est quoi ?
sont des objets
permettent de regrouper et gérer plusieurs objets de taille et/ou
type dynamiques
(des tableaux multi-types extensibles)
H & H: Research and Training 12 / 38
Les collections
Les collections
Quelques collections c#
ArrayList : tableau dynamique
BitArray : tableau statique de booléens
Queue : file appliquant le principe FIFO (First In First Out)
Hashtable : collection de couple clé/valeur
SortedList : collection de couple clé/valeur ordonnée selon la
clé
Stack : collection appliquant le principe LIFO (Last In First Out)
H & H: Research and Training 13 / 38
Les collections
Les collections
Pour utiliser une liste, il faut importer le namespace
using [Link];
H & H: Research and Training 14 / 38
Les collections
Les collections
Pour utiliser une liste, il faut importer le namespace
using [Link];
Exemple avec BitArray
BitArray b = new BitArray(2);
[Link](0, true);
[Link](1, false);
[Link](2, true);
H & H: Research and Training 14 / 38
Les collections
Les collections
Pour utiliser une liste, il faut importer le namespace
using [Link];
Exemple avec BitArray
BitArray b = new BitArray(2);
[Link](0, true);
[Link](1, false);
[Link](2, true);
La dernière instruction déclenche une exception car on ne peut
dépasser la taille du tableau
H & H: Research and Training 14 / 38
Les collections
Les collections
Exemple avec Queue
Queue q = new Queue();
[Link](2);
[Link](3);
[Link]("bonjour");
[Link](5);
[Link]();
foreach (var o in q)
[Link](o);
H & H: Research and Training 15 / 38
Les collections
Les collections
Exemple avec Queue
Queue q = new Queue();
[Link](2);
[Link](3);
[Link]("bonjour");
[Link](5);
[Link]();
foreach (var o in q)
[Link](o);
Affiche 3 bonjour 5
H & H: Research and Training 15 / 38
Les collections
Les collections
Exemple avec ArrayList
ArrayList arrayList = new ArrayList();
[Link](2);
[Link]("Bonjour");
[Link](’c’);
[Link](8);
[Link](’c’);
[Link](1);
foreach (var o in arrayList)
[Link](o);
H & H: Research and Training 16 / 38
Les collections
Les collections
Exemple avec ArrayList
ArrayList arrayList = new ArrayList();
[Link](2);
[Link]("Bonjour");
[Link](’c’);
[Link](8);
[Link](’c’);
[Link](1);
foreach (var o in arrayList)
[Link](o);
Affiche 2 8
H & H: Research and Training 16 / 38
Les collections génériques
Les collections
Les collections génériques, c’est quoi ?
sont des collections
avec précision de type, mais de taille dynamique
(des tableaux extensibles)
H & H: Research and Training 17 / 38
Les collections génériques
Les collections
Les collections génériques, c’est quoi ?
sont des collections
avec précision de type, mais de taille dynamique
(des tableaux extensibles)
Collections
List Dictionary Stack
H & H: Research and Training 17 / 38
Les collections génériques
Les collections
Pourquoi utiliser les collections génériques ?
Pour
imposer un type pour tous les éléments de la collection
éviter d’avoir des exceptions si le type attendu ne correspond pas
au type d’un élément
éviter de faire de conversions inutiles
...
H & H: Research and Training 18 / 38
Les collections génériques Les listes
Les listes
Pour utiliser une liste, il faut importer le namespace
using [Link];
Déclaration
List <type> nomListe = new List<type>();
Exemple
List <string> voitures = new List<string>();
Déclaration + initialisation
List <string> voitures = new List<string> {"Citroen"
, "Ford", "Peugeot", "Mercedes"};
H & H: Research and Training 19 / 38
Les collections génériques Les listes
Les listes
Ajout d’un élément
[Link]("Renault");
Accès à un élément du tableau en lecture ou en écriture
voitures[3] = "Volkswagen"; // correct
[Link](voitures[2]); // imprime peugeot
voitures[5] = "Fiat"; // déclenche une exception car
il n’existe aucun élément d’indice 4
H & H: Research and Training 20 / 38
Les collections génériques Les listes
Les tableaux
Parcourir un tableau avec un for
for (int i = 0; i < [Link]-1; i++)
[Link](voitures[i]);
// Count retourne la taille exacte du tableau
// Atttention à l’utilisation de Capacity qui retourne le
plus petit multiple de 4 supérieur au égal à la
taille réelle de la liste
Parcourir un tableau avec un foreach
foreach (var voiture in voitures)
{
[Link](voiture);
}
Parcourir un tableau avec un .ForEach
[Link](elt => [Link](elt));
H & H: Research and Training 21 / 38
Les collections génériques Les listes
Les tableaux
Autres méthodes sur les listes
RemoveAt(n) : supprime d’une liste l’élément d’indice n (il existe
aussi Remove et RemoveAll)
IndexOf(n) : retourne l’indice de la première apparition de la
valeur n dans une liste
Contains(n) : retourne true si n appartient à la liste
Find(elt => condition) : retourne le premier élément de la
liste qui respecte condition (Exists fonctionne d’une manière
similaire mais elle retourne un booléen)
Sort() : trie une liste d’entiers
ToArray() : retourne un tableau statique résultat de la
conversion de la liste
...
H & H: Research and Training 22 / 38
Les collections génériques Les listes
Les tableaux vs les listes
Quoi choisir ?
Un tableau peut être multidimensionnel mais il est de taille fixe.
Une liste est unidimensionnel mais elle est de taille variable.
On ne peut supprimer un élément situé au début ou au milieu d’un
tableau.
H & H: Research and Training 23 / 38
Les collections génériques Les listes
Les tableaux
Les tableaux
object[] obj = new object[2];
obj[0] = "chaine";
obj[1] = 2;
foreach (object elt in obj)
{
[Link](elt );
}
Les listes
List<object> list = new List<object>();
[Link]("chaine");
[Link](2);
foreach (object elt in list)
{
[Link](elt );
}
H & H: Research and Training 24 / 38
Les collections génériques Les dictionnaires
Les dictionnaires
Les dictionnaires
une collection de couple clé/valeur
une clé est un indice personnalisé (unique)
Déclaration
Dictionary<type1, type2> dic = new Dictionary<type1,
type2>();
Exemple
Dictionary<int, string> fcb = new Dictionary<int,
string>();
H & H: Research and Training 25 / 38
Les collections génériques Les dictionnaires
Les dictionnaires
Remplir le dictionnaire
[Link](10, "messi");
[Link](23, "umtiti");
[Link](4, "Rakitic");
[Link](9, "Suarez");
Vérifier l’appartenance d’une valeur et/ou d’une clé à un
dictionnaire
[Link]([Link]("iniesta"));
[Link]([Link](10));
H & H: Research and Training 26 / 38
Les collections génériques Les dictionnaires
Les dictionnaires
Parcourir le dictionnaire et afficher le couple (clé,valeur)
foreach (KeyValuePair<int,string> elt in fcb)
[Link]([Link] + [Link]);
H & H: Research and Training 27 / 38
Les collections génériques Les dictionnaires
Les dictionnaires
Parcourir le dictionnaire et afficher le couple (clé,valeur)
foreach (KeyValuePair<int,string> elt in fcb)
[Link]([Link] + [Link]);
Parcourir le dictionnaire pour afficher les valeurs
foreach (string elt in [Link])
[Link](elt);
H & H: Research and Training 27 / 38
Les collections génériques Les dictionnaires
Les dictionnaires
Parcourir le dictionnaire et afficher le couple (clé,valeur)
foreach (KeyValuePair<int,string> elt in fcb)
[Link]([Link] + [Link]);
Parcourir le dictionnaire pour afficher les valeurs
foreach (string elt in [Link])
[Link](elt);
Pour récupérer la liste des clés, il faut déclarer un KeyCollection
Dictionary<int,string>.KeyCollection clefs = [Link];
foreach (int elt in clefs)
[Link](elt);
H & H: Research and Training 27 / 38
Les collections génériques Les dictionnaires
Les dictionnaires
Pour récupérer la liste des valeurs, il faut déclarer un ValueCollection
Dictionary<int,string>.ValueCollection vals = [Link];
foreach (string elt in vals)
[Link](elt);
H & H: Research and Training 28 / 38
Les collections génériques Les dictionnaires
Les dictionnaires
Pour récupérer la liste des valeurs, il faut déclarer un ValueCollection
Dictionary<int,string>.ValueCollection vals = [Link];
foreach (string elt in vals)
[Link](elt);
Pour modifier la valeur d’un élément selon la clé
fcb[10] = "Rivaldo";
foreach (int elt in clefs)
[Link](elt);
H & H: Research and Training 28 / 38
Les collections génériques Les piles
Les piles
Les piles
une collection appliquant l’algorithme (LIFO, Last In First Out)
impossible donc de supprimer/modifier/lire un élément au milieu
de la liste
Déclaration
Stack<type> nomPile = new Stack<type>();
Exemple
Stack<int> pile = new Stack<int>();
H & H: Research and Training 29 / 38
Les collections génériques Les piles
Les piles
Empiler : ajouter un élément au sommet de la pile
[Link](2);
[Link](1);
[Link](5);
H & H: Research and Training 30 / 38
Les collections génériques Les piles
Les piles
Empiler : ajouter un élément au sommet de la pile
[Link](2);
[Link](1);
[Link](5);
Parcourir une pile
foreach (int elt in pile)
[Link](elt);
// affiche 5 1 2
H & H: Research and Training 30 / 38
Les collections génériques Les piles
Les piles
Empiler : ajouter un élément au sommet de la pile
[Link](2);
[Link](1);
[Link](5);
Parcourir une pile
foreach (int elt in pile)
[Link](elt);
// affiche 5 1 2
Consulter un élément au sommet de la pile
[Link]();
H & H: Research and Training 30 / 38
Les collections génériques Les piles
Les piles
Dépiler : supprimer l’élément au sommet de la pile
[Link]();
H & H: Research and Training 31 / 38
Les collections génériques Les piles
Les piles
Dépiler : supprimer l’élément au sommet de la pile
[Link]();
Supprimer tous les éléments de la pile
[Link]();
H & H: Research and Training 31 / 38
Les énumérations
Les énumérations
Une énumération, c’est quoi ?
un ensemble de constantes nommées
ne pouvant pas être déclaré dans le Main
H & H: Research and Training 32 / 38
Les énumérations
Les énumérations
Déclaration d’une énumération
enum Sports { Foot, Hand, Hockey, Tennis, Basket };
Par défaut, le premier élément a la valeur 0.
L’élément successif a une valeur augmenté de 1.
Exemple
[Link]([Link]); // affiche Tennis
On peut utiliser une énumération comme un type
Sports sport = [Link];
[Link](sport); // affiche Foot
Récupérer la valeur
[Link]((int)sport); // affiche 0
[Link]((int)[Link]); // affiche 3
H & H: Research and Training 33 / 38
Les énumérations
Les énumérations
Déclaration d’une énumération + modification des constantes par
défaut
enum Sports { Foot=2, Hand, Hockey=5, Tennis, Basket
};
Exemple
[Link]((int)[Link]); // affiche 3
[Link]((int)[Link]); // affiche 5
[Link]((int)[Link]); // affiche 6
H & H: Research and Training 34 / 38
Les boucles
Les boucles
Syntaxe while
while (condition) // tant que l’expression logique
est vraie
{
// ce traitement est fait
}
Syntaxe do while
do // répéter
{
// ce traitement
}
while (condition); // tant que l’expression logique
est vraie
Attention aux boucles infinies, pensez à une condition d’arrêt
H & H: Research and Training 35 / 38
Les boucles
Les boucles
Remarques
Dans ces structures itératives, on peut utiliser :
break : pour quitter la boucle
continue : pour ignorer l’itération courante
H & H: Research and Training 36 / 38
Les boucles
Les boucles
Exemple avec break
int j = 5;
do
{
[Link](j);
if (j == 3)
break;
j--;
}
while (j > 0);
H & H: Research and Training 37 / 38
Les boucles
Les boucles
Exemple avec break
int j = 5;
do
{
[Link](j);
if (j == 3)
break;
j--;
}
while (j > 0);
Affichage : 5 4 3
H & H: Research and Training 37 / 38
Les boucles
Les boucles
Exemple avec continue
int j = 5;
while (j > 0)
{
if (j == 3)
{
j--;
continue;
}
j--;
[Link](j);
}
H & H: Research and Training 38 / 38
Les boucles
Les boucles
Exemple avec continue
int j = 5;
while (j > 0)
{
if (j == 3)
{
j--;
continue;
}
j--;
[Link](j);
}
Affichage : 4 3 1
H & H: Research and Training 38 / 38