You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mchsamples-.net-core/ex_023_015_DictionaryCustom.../Program.cs

151 lines
6.0 KiB

// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : Program.cs
// Author : Marc Chevaldonné
// Creation date : 2016-09-29
//
// ========================================================================
using System;
using System.Collections.Generic;
using static System.Console;
namespace ex_023_015_DictionaryCustomType
{
class Program
{
/// <summary>
/// exemple d'utilisation d'un dictionnaire sur un type personnalisé (une classe Nounours)
/// 1. dans le premier cas, la classe (VieuxNounours) n'implémente pas le protocole d'égalité.
/// L'exemple montre les problèmes qui peuvent apparaître : deux instances a priori égales ne sont pas comprises par le dictionnaire comme étant la même
/// 2. dans le deuxième cas, la classe (Nounours) implémente le protocole d'égalité.
/// Plus de problème.
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
WriteLine("*****************************");
WriteLine("TEST SANS PROTOCOLE D'EGALITE");
WriteLine("*****************************");
TestAvecVieuxNounours();
WriteLine("\n\n\n");
WriteLine("*****************************");
WriteLine("TEST AVEC PROTOCOLE D'EGALITE");
WriteLine("*****************************");
TestAvecNounours();
}
static void TestAvecVieuxNounours()
{
VieuxNounours mouton = new VieuxNounours("mouton", new DateTime(2005, 04, 03), 2000);
VieuxNounours ours = new VieuxNounours("ours", new DateTime(2006, 05, 04), 3000);
VieuxNounours chien = new VieuxNounours("chien", new DateTime(2007, 06, 05), 1500);
VieuxNounours girafe = new VieuxNounours("girafe", new DateTime(2008, 07, 06), 500);
VieuxNounours dromadaire = new VieuxNounours("dromadaire", new DateTime(2012, 3, 11), 500);
//préparation du dictionnaire
var dico = new Dictionary<VieuxNounours, int>()
{
[mouton] = 0,
[ours] = 0,
[chien] = 0,
[girafe] = 0,
[dromadaire] = 0,
};
//on peut aussi utiliser cet equality comparer pour éviter le problème suivant
//var dico = new Dictionary<VieuxNounours, int>(new VieuxNounoursNbPoilsEqualityComparer());
//affichage du dictionnaire
DisplayVieuxDico(dico);
//on incrémente la valeur associée à la clé mouton, et celle associée à la clé chien
dico[mouton]++;
dico[chien]++;
DisplayVieuxDico(dico);
//on crée un nouveau chien (qui a les mêmes données que le premier, mais la référence n'est pas la même)
VieuxNounours chien2 = new VieuxNounours("chien", new DateTime(2007, 06, 05), 1500);
//chien2 n'est pas trouvé dans le dictionnaire car chien2 != chien, car ce sont des références différentes
//(le protocole d'égalité n'a pas été réécrit)
WriteLine(dico.ContainsKey(chien2));
if (dico.ContainsKey(chien2))
{
dico[chien2]++;
}
else
{
dico.Add(chien2, 1);
}
DisplayVieuxDico(dico);
}
static void DisplayVieuxDico(Dictionary<VieuxNounours, int> dico)
{
WriteLine("**********************");
foreach (KeyValuePair<VieuxNounours, int> pair in dico)
{
WriteLine($"{pair.Key.Name} {pair.Value}");
}
WriteLine("**********************");
}
static void TestAvecNounours()
{
Nounours mouton = new Nounours("mouton", new DateTime(2005, 04, 03), 2000);
Nounours ours = new Nounours("ours", new DateTime(2006, 05, 04), 3000);
Nounours chien = new Nounours("chien", new DateTime(2007, 06, 05), 1500);
Nounours girafe = new Nounours("girafe", new DateTime(2008, 07, 06), 500);
Nounours dromadaire = new Nounours("dromadaire", new DateTime(2012, 3, 11), 500);
//préparation du dictionnaire
var dico = new Dictionary<Nounours, int>()
{
[mouton] = 0,
[ours] = 0,
[chien] = 0,
[girafe] = 0,
[dromadaire] = 0,
};
//var dico = new Dictionary<Nounours, int>(new NounoursNbPoilsEqualityComparer());
//affichage du dictionnaire
DisplayDico(dico);
//on incrémente la valeur associée à la clé mouton, et celle associée à la clé chien dico[mouton]++;
dico[chien]++;
DisplayDico(dico);
//on crée un nouveau chien (qui a les mêmes données que le premier, mais la référence n'est pas la même)
Nounours chien2 = new Nounours("chien", new DateTime(2007, 06, 05), 1500);
//chien2 est trouvé dans le dictionnaire car chien2 == chien, d'après le protocole d'égalité
//(même si les références sont différentes)
WriteLine(dico.ContainsKey(chien2));
if (dico.ContainsKey(chien2))
{
dico[chien2]++;
}
else
{
dico.Add(chien2, 1);
}
DisplayDico(dico);
}
static void DisplayDico(Dictionary<Nounours, int> dico)
{
WriteLine("**********************");
foreach (KeyValuePair<Nounours, int> pair in dico)
{
WriteLine($"{pair.Key.Name} {pair.Value}");
}
WriteLine("**********************");
}
}
}