Page d'Accueil

Classes Intégrées: Tableaux Hachés 

 

Introduction

Si vous aviez un temps soit peu joué un peu plus profondément avec Microsoft Windows, vous êtes probablement au courant des objets appelés fichiers d'initialisation ou fichiers ini. Ce sont des fichiers dont le contenu est fait de lignes dont chacune affiche une combinaison d'une valeur de droite assignée à une valeur de gauche. Voici un exemple :

PROJECT=AIOCPE
MANUFACTURER=HP
Wrapper=1
DEFAULT=1
LOG_DISABLED=0
LOG_ERROR=1
LOG_WARNING=2
LOG_MAINTRACE=4
LOG_DETAILEDTRACE=8
FILESIZE=524288

Un tableau haché est une liste d'articles dont chacun (article) est fait d'un objet de droite assigné à un objet de gauche. L'objet du côté gauche s'appelle une clef. L'objet du côté droit s'appelle une valeur. Basé sur ceci, un article d'un tableau haché est sous la forme :

Key=Value

La plupart des tableaux hachés sont faits de clefs chaîne de caractères et de valeurs chaîne chaîne de caractères mais la clef ou la valeur peut également être un nombre ou un article plus complexe. Il n'y a aucune règle stricte quant à ce que vous utilisez dans un tableau haché. Quand vous en créez un, il vous l'appartient de décider ce que vous voulez en faire.

Étude pratiqueÉtude pratique : Présentation des tableaux hachés

  1. Créez une nouvelle application de console appelée GeorgetownCleaningServices8
  2. Sauvegardez le projet, sur la barre d'outils standard, cliquez le bouton Enregistrer tout  Économiser tous
  3. Acceptez tous défauts et cliquer Enregistrer
  4. Pour créer une nouvelle classe, sur le menu principal, cliquez projet - > Ajouter la classe…
  5. Placez le nom CleaningOrderDetails et cliquez Ajouter
  6. Changez le fichier comme suit :
     
    namespace GeorgetownCleaning7
    {
        [Serializable]
        public class CleaningOrderDetails
        {
            // Receipt identification
            public int ReceiptNumber;
            public string CustomerName;
            public string CustomerPhoneNumber;
            // The date the cleaning items were deposited
            public DateTime OrderDate;
            public DateTime OrderTime;
            // Numbers to represent cleaning items
            public uint NumberOfShirts;
            public uint NumberOfPants;
            public uint NumberOtherItems;
    
            // Price of items
            public decimal PriceOneShirt = 0.95M;
            public decimal PriceAPairOfPants = 2.95M;
            public decimal PriceOtherItems = 4.55M;
            public decimal TaxRate = 0.0575M;  // 5.75%
    
            // Each of these sub totals will be used for cleaning items
            public decimal SubTotalShirts;
            public decimal SubTotalPants;
            public decimal SubTotalOtherItems;
    
            // Values used to process an order
            public decimal TotalOrder;
            public decimal TaxAmount;
            public decimal SalesTotal;
        }
    }
  7. Sauvegardez le fichier

Créer un tableau haché

.NET Framework soutient à différents niveaux les tableaux hachés mais la classe la plus commune utilisée s'appelle probablement Hashtable. La classe Hashtable  met en application l'interface ISerializable qui rend possible la sérialisation des listes, l'interface ICollection utilisée pour maintenir le nombre d'articles dans la liste, l'interface IEnumerable qui vous permettrait d'utiliser la boucle foreach.

Avant d'utiliser un tableau haché, vous pouvez déclarer une variable de type Hashtable en utilisant un de ses constructeurs tels que celui par défaut. Voici un exemple :

using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static int Main(string[] args)
        {
            Hashtable Chelsea20062007 = new Hashtable();

            return 0;
        }
    }
}

Dans ce cas-ci, la liste primaire serait vide.

Pour ajouter un article au tableau, vous pouvez appeler la méthode Add (). Sa syntaxe est :

public virtual void Add(object Key, object Value);

Comme vous pouvez voir, vous devez fournir la clef et la valeur comme premiers et deuxièmes arguments à la méthode. Voici les exemples d'appel de la méthode Add () :

using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static int Main(string[] args)
        {
            Hashtable Chelsea20062007 = new Hashtable();

            Chelsea20062007.Add("Michael", "Ballack");
            Chelsea20062007.Add("Didier", "Drogba");

            return 0;
        }
    }
}

En appelant la méthode Add (), vous devez fournir un argument principal valide : il peut être nul. Par exemple, le code suivant produirait une erreur :

using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static int Main(string[] args)
        {
            Hashtable Chelsea20062007 = new Hashtable();

            Chelsea20062007.Add("Michael", "Ballack");
            Chelsea20062007.Add("Didier", "Drogba");
            Chelsea20062007.Add(null, "Essien");

            return 0;
        }
    }
}

Ceci produirait :

Unhandled Exception: System.ArgumentNullException:
 Key cannot be null.

En ajoutant les articles à la liste, chaque clef doit être unique : vous ne pouvez pas avoir deux clefs identiques. Si vous essayez d'ajouter une clef qui existe déjà dans la liste, l'ordinateur rejetterait une exception ArgumentException. Basé sur ceci, le code suivant ne fonctionnerait pas parce que, au troisième appel, une clef  ''Michael'' existe déjà :

using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static int Main(string[] args)
        {
            Hashtable Chelsea20062007 = new Hashtable();

            Chelsea20062007.Add("Michael", "Ballack");
            Chelsea20062007.Add("Didier",  "Drogba");
            Chelsea20062007.Add("Michael", "Essien");

            return 0;
        }
    }
}

Ceci produirait :

Unhandled Exception: System.ArgumentException: 
Item has already been added. Key
in dictionary: 'Michael'  Key being added: 'Michael'

En plus de la méthode Add (), vous pouvez utiliser la propriété indexée de la classe Hashtable pour ajouter un article à la liste. Pour ce faire, écrire la clef dans les crochets de la propriété et lui assigner la valeur désirée. Voici un exemple :

using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static int Main(string[] args)
        {
            Hashtable Chelsea20062007 = new Hashtable();

            Chelsea20062007.Add("Michael", "Ballack");
            Chelsea20062007.Add("Didier", "Drogba");

            Chelsea20062007["Claude"] = "Makelele";

            return 0;
        }
    }
}

Après avoir ajouté un ou plusieurs articles à la liste, ils sont stockés dans deux collections. Les clefs sont stockées dans une collection représentée par une propriété appelée Keys. Les valeurs sont stockées dans la propriété Values. Chacune de ces propriétés est de type ICollection.

Accès aux articles d'un tableau haché

Bien que, ou parce que, la clef et la valeur soient distinctes, pour considérer leur combinaison comme objet simple, .NET Framework fournit la structure DictionaryEntry. Pour accéder à un article, vous pouvez utiliser la boucle foreach pour visiter chaque article. Pour soutenir la boucle foreach, la classe Hashtable applique la méthode IEnumerable.GetEnumerator (). Dans ce cas-ci, l'article est de type DictionaryEntry : il contient une clef et une valeur en association. La structure DictionaryEntry contient deux propriétés appelées Key et Value pour identifier les composants d'une combinaison. Voici un exemple :

using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static int Main(string[] args)
        {
            Hashtable Chelsea20062007 = new Hashtable();

            Chelsea20062007.Add("Michael", "Ballack");
            Chelsea20062007.Add("Didier", "Drogba");
            Chelsea20062007["Claude"] = "Makelele";

            foreach (DictionaryEntry entry in Chelsea20062007)
                Console.WriteLine("{0} {1}", entry.Key, entry.Value);

            Console.WriteLine();
            return 0;
        }
    }
}

Ceci produirait :

Didier Drogba
Michael Ballack
Claude Makelele

Press any key to continue . . .
 

Étude pratiqueÉtude pratique : Employer une table de brouillage

  1. pour créer une nouvelle classe, dans Affichage des classes, droit-cliquez GeorgetownCleaningServices7 - > Ajouter - > classe…
  2. Placez le nom Custumers et appuyez Enter
  3. Changez le fichier comme suit :
     
    using System;
    
    namespace GeorgetownCleaningServices8
    {
        [Serializable]
        public class Customer
        {
            public string Name;
            public string PhoneNumber;
        }
    }
  4. Pour créer une nouvelle classe, dans l'explorateur de solution, droit-cliquez GeorgetownCleaningServices7 - > Ajouter - > classe…
  5. Placez le nom CleaningOrderManagement et cliquez Ajouter
  6. Changez le fichier comme suit :
     
    using System;
    using System.IO;
    using System.Collections;
    using System.Runtime.Serialization.Formatters.Binary;
    
    namespace GeorgetownCleaningServices8
    {
        public class CleaningDeposit
        {
            // We need a global customer info to 
            // modify/update it from anywhere
            string strCustomerName;
            string strPhoneNumber;
    
            // This is the list that will hold the cleaning orders
            ArrayList CleaningOrders;
            // This is a list that will hold the combinations of 
            // a customer's name and telephone number
            private Hashtable Customers;
            public CleaningOrderDetails depot;
    
            public CleaningDeposit()
            {
                this.Customers = new Hashtable();
                this.CleaningOrders = new ArrayList();
                this.strPhoneNumber = "(000) 000-0000";
                this.strCustomerName = "Unknown";
                this.depot = new CleaningOrderDetails();
    
                CheckDefaultFolder();
                CheckDefaultFiles();
            }
    
            private void CheckDefaultFolder()
            {
                DirectoryInfo diGCS =
                    new DirectoryInfo(@"C:\Georgetown " +
                                      "Cleaning Services");
                try
                {
                    if (!diGCS.Exists)
                        diGCS.Create();
                }
                catch (IOException)
                {
                    Console.WriteLine("The directory could not be created");
                }
            }
    
            // This method ensures that there are the necessary files 
            // used to process a cleaning order
            public void CheckDefaultFiles()
            {
                FileStream fsCustomers = null;
                BinaryFormatter bfCustomers = new BinaryFormatter();
    
                // The Customers.cst file will contain the 
                // information about the customers
                string strFilename =
                    @"C:\Georgetown Cleaning Services\Customers.cst";
    
                // When the application starts, if the list of
                // customers doesn't (yet) exist, then create it
                if (!File.Exists(strFilename))
                {
                    Customers.Add(strPhoneNumber, strCustomerName);
    
                    try
                    {
                        fsCustomers  = new FileStream(strFilename,
                                                      FileMode.Create,
                                                      FileAccess.Write);
                        bfCustomers.Serialize(fsCustomers, Customers);
                    }
                    finally
                    {
                        fsCustomers.Close();
                    }
                }
                
                // The CleaningOrders.gco file will 
                // contain the cleaning orders
                strFilename = @"C:\Georgetown Cleaning " +
                              @"Services\CleaningOrders.gco";
    
                if (!File.Exists(strFilename))
                {
                    FileStream fsCleaningOrders = null;
                    BinaryFormatter bfCleaningOrders =
                        new BinaryFormatter();
    
                    // This file will contain only useless default values
                    // Normally, this cleaning order should never be deleted
                    this.depot.ReceiptNumber = 0;
                    this.depot.CustomerName = strCustomerName;
                    this.depot.CustomerPhoneNumber = strPhoneNumber;
                    this.depot.OrderDate = new DateTime(1960, 1, 1);
                    this.depot.OrderTime = new DateTime(1960, 1, 1,
                                                        1, 1, 1);
                    this.depot.NumberOfShirts = 0;
                    this.depot.NumberOfPants = 0;
                    this.depot.NumberOtherItems = 0;
    
                    this.depot.PriceOneShirt = 0.00M;
                    this.depot.PriceAPairOfPants = 0.00M;
                    this.depot.PriceOtherItems = 0.00M;
                    this.depot.TaxRate = 0.00M;  // 5.75%
    
                    this.depot.SubTotalShirts = 0;
                    this.depot.SubTotalPants = 0;
                    this.depot.SubTotalOtherItems = 0;
    
                    this.depot.TotalOrder = 0;
                    this.depot.TaxAmount = 0;
                    this.depot.SalesTotal = 0;
    
                    // After creating this default order, 
                    // add it to the collection
                    this.CleaningOrders.Add(this.depot);
    
                    // After creating the cleaning order, save it
                    try
                    {
                        fsCleaningOrders = new FileStream(strFilename,
                                                          FileMode.Create,
                                                          FileAccess.Write);
                        bfCleaningOrders.Serialize(fsCleaningOrders,
                                                   CleaningOrders);
                    }
                    finally
                    {
                        fsCleaningOrders.Close();
                    }
                }
            }
    
            // This method is used to find out if the customer 
            // already exists in our database
            private void IdentifyCustomer()
            {
                bool found = false;
                string strTelephoneNumber = "000";
    
                do
                {
                    Console.Write("Enter Customer Phone Number: ");
                    strTelephoneNumber = Console.ReadLine();
    
                    // Remove the spaces, parentheses, and dashes, if any
                    strTelephoneNumber =
                        strTelephoneNumber.Replace(" ", "");
                    strTelephoneNumber =
                        strTelephoneNumber.Replace("(", "");
                    strTelephoneNumber =
                        strTelephoneNumber.Replace(")", "");
                    strTelephoneNumber =
                        strTelephoneNumber.Replace("-", "");
    
                    if (strTelephoneNumber.Length != 10)
                    {
                        // We will use a (small version of) 
                        // Canada and US telephone numbers
                        Console.WriteLine("Invalid telphone number: " +
                                          "you entered {0} " +
                                          "characters instead of 10 digits",
                                          strTelephoneNumber.Length);
                    }
                } while (strTelephoneNumber.Length != 10);
    
                // We will use the same formula for 
                // telephone numbers: (000) 000-0000
                strPhoneNumber = "(" + strTelephoneNumber.Substring(0, 3) +
                                    ") " + strTelephoneNumber.Substring(3, 3) +
                                    "-" + strTelephoneNumber.Substring(6, 4);
    
                string strFilename =
                    @"C:\Georgetown Cleaning Services\Customers.cst";
    
                if (File.Exists(strFilename))
                {
                    FileStream fsCustomers = File.Open(strFilename,
                                                       FileMode.Open,
                                                       FileAccess.Read);
                    BinaryFormatter bfCustomers = new BinaryFormatter();
                    Customers = (Hashtable)bfCustomers.Deserialize(fsCustomers);
                    fsCustomers.Close();
    
                    foreach (DictionaryEntry de in Customers)
                    {
                        if ((string)de.Key == strPhoneNumber)
                        {
                            found = true;
                            strPhoneNumber = (string)de.Key;
                            strCustomerName = (string)de.Value;
                        }
                    }
    
                    if (found == true)
                    {
                        Console.WriteLine("\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
                        Console.WriteLine("-/- Georgetown Cleaning Services -/-");
                        Console.WriteLine("------------------------------------");
                        Console.WriteLine("Customer Name: {0}", strCustomerName);
                        Console.WriteLine("Phone Number:  {0}", strPhoneNumber);
                        Console.WriteLine("------------------------------------\n");
                    }
                    else // If the customer information was not found in a file
                    {
                        Console.WriteLine("This is the first cleaning order " + 
                                          "of this customer");
                        FileStream fsCustomer = new FileStream(strFilename,
    							   FileMode.Create,
    							   FileAccess.Write);
                        BinaryFormatter bfCustomer = new BinaryFormatter();
                        Console.Write("Enter Customer Name: ");
                        strCustomerName = Console.ReadLine();
    
                        Customers.Add(strPhoneNumber, strCustomerName);
                        bfCustomer.Serialize(fsCustomer, Customers);
                        fsCustomer.Close();
                    }
                }
                else
                    Console.WriteLine("The Customers list was not found");
            }
    
            public void ProcessOrder()
            {
                // These two pieces of information are used for money change
                decimal AmountTended;
                decimal Difference;
    
                Console.WriteLine("-/- Georgetown Cleaning Services -/-");
                this.IdentifyCustomer();
                
                try
                {
                    Console.Write("Enter the order date(mm/dd/yyyy):  ");
                    this.depot.OrderDate = DateTime.Parse(Console.ReadLine());
                }
                catch (FormatException)
                {
                    Console.WriteLine("The value you entered is not a valid date");
                }
                try
                {
                    Console.Write("Enter the order time(hh:mm AM/PM): ");
                    this.depot.OrderTime = DateTime.Parse(Console.ReadLine());
                }
                catch
                {
                    Console.WriteLine("The value you entered is not a valid time");
                }
    
                // Request the quantity of each category of items
                try
                {
                    Console.Write("Number of Shirts:      ");
                    this.depot.NumberOfShirts =
                        uint.Parse(Console.ReadLine());
                    if (this.depot.NumberOfShirts < uint.MinValue)
                        throw new OverflowException("Negative value not " +
                                                    "allowed for shirts");
                }
                catch (FormatException)
                {
                    Console.WriteLine("The value you typed for the number of " +
                                      "shirts is not a valid number");
                }
                try
                {
                    Console.Write("Number of Pants:       ");
                    this.depot.NumberOfPants =
                        uint.Parse(Console.ReadLine());
                }
                catch (FormatException)
                {
                    Console.WriteLine("The value you typed for the number of " +
                                      "pair or pants is not a valid number");
                }
                try
                {
                    Console.Write("Number of Other Items: ");
                    this.depot.NumberOtherItems = uint.Parse(Console.ReadLine());
                }
                catch (FormatException)
                {
                    Console.WriteLine("The value you typed for the number of " +
                                      "other items is not a valid number");
                }
                // Perform the necessary calculations
                this.depot.SubTotalShirts =
                    this.depot.NumberOfShirts * this.depot.PriceOneShirt;
                this.depot.SubTotalPants =
                    this.depot.NumberOfPants * this.depot.PriceAPairOfPants;
                this.depot.SubTotalOtherItems =
                    this.depot.NumberOtherItems * this.depot.PriceOtherItems;
                // Calculate the "temporary" total of the order
                this.depot.TotalOrder = this.depot.SubTotalShirts +
                                        this.depot.SubTotalPants +
                                        this.depot.SubTotalOtherItems;
    
                // Calculate the tax amount using a constant rate
                this.depot.TaxAmount = this.depot.TotalOrder * this.depot.TaxRate;
                // Add the tax amount to the total order
                this.depot.SalesTotal = this.depot.TotalOrder + this.depot.TaxAmount;
    
                // Communicate the total to the user...
                Console.WriteLine("\nThe Total order is: {0:C}", 
    		this.depot.SalesTotal);
                // and request money for the order
                try
                {
                    Console.Write("Amount Tended? ");
                    AmountTended = decimal.Parse(Console.ReadLine());
                }
                catch (FormatException)
                {
                    Console.WriteLine("You were asked to enter an " +
                                      "amount of money but...");
                }
                // Calculate the difference owed to the customer
                // or that the customer still owes to the store
                Difference = AmountTended - this.depot.SalesTotal;
    
                this.PreviewReceipt();
                this.SaveCleaningOrder();
            }
    
            public void PreviewReceipt()
            {
                Console.WriteLine();
                // Display the receipt
                Console.WriteLine("====================================");
                Console.WriteLine("-/- Georgetown Cleaning Services -/-");
                Console.WriteLine("====================================");
                Console.WriteLine("Customer:    {0}", this.strCustomerName);
                Console.WriteLine("Home Phone:  {0}", this.strPhoneNumber);
                Console.WriteLine("Order Date:  {0:D}", this.depot.OrderDate);
                Console.WriteLine("Order Time:  {0:t}", this.depot.OrderTime);
                Console.WriteLine("------------------------------------");
                Console.WriteLine("Item Type    Qty Unit/Price Sub-Total");
                Console.WriteLine("------------------------------------");
                Console.WriteLine("Shirts      {0,3}   {1,4}      {2,6}",
                                  this.depot.NumberOfShirts,
                                  this.depot.PriceOneShirt,
                                  this.depot.SubTotalShirts);
                Console.WriteLine("Pants       {0,3}   {1,4}      {2,6}",
                                 this.depot.NumberOfPants,
                                 this.depot.PriceAPairOfPants,
                                 this.depot.SubTotalPants);
                Console.WriteLine("Other Items {0,3}   {1,4}      {2,6}",
                                  this.depot.NumberOtherItems,
                                  this.depot.PriceOtherItems,
                                  this.depot.SubTotalOtherItems);
                Console.WriteLine("------------------------------------");
                Console.WriteLine("Total Order:   {0,6}",
                                  this.depot.TotalOrder.ToString("C"));
                Console.WriteLine("Tax Rate:      {0,6}",
                                  this.depot.TaxRate.ToString("P"));
                Console.WriteLine("Tax Amount:    {0,6}",
                                  this.depot.TaxAmount.ToString("C"));
                Console.WriteLine("Net Price:     {0,6}",
                                  this.depot.SalesTotal.ToString("C"));
                Console.WriteLine("------------------------------------");
                Console.WriteLine("Amount Tended: {0,6}",
                                  AmountTended.ToString("C"));
                Console.WriteLine("Difference:    {0,6}",
                                  Difference.ToString("C"));
                Console.WriteLine("====================================");
            }
    
            public void SaveCleaningOrder()
            {
                int highReceiptNumber = 0;
                FileStream fsCleaningOrders = null;
                BinaryFormatter bfCleaningOrders = new BinaryFormatter();
    
                string strFilename =
                    @"C:\Georgetown Cleaning Services\CleaningOrders.gco";
    
                if (File.Exists(strFilename))
                {
                    try
                    {
                        fsCleaningOrders = new FileStream(strFilename,
                                                          FileMode.Open,
                                                          FileAccess.Read);
                        CleaningOrders =
                            (ArrayList)bfCleaningOrders.Deserialize(fsCleaningOrders);
                    }
                    finally
                    {
                        fsCleaningOrders.Close();
                    }
    
                    highReceiptNumber =
                        ((CleaningOrderDetails)CleaningOrders[CleaningOrders.Count
                                                              - 1]).ReceiptNumber;
    
                    this.depot.ReceiptNumber = highReceiptNumber + 1;
                    this.depot.CustomerName = strCustomerName;
                    this.depot.CustomerPhoneNumber = strPhoneNumber;
    
                    this.CleaningOrders.Add(this.depot);
    
                    try
                    {
                        fsCleaningOrders = new FileStream(strFilename,
                                                          FileMode.Create,
                                                          FileAccess.Write);
                        bfCleaningOrders.Serialize(fsCleaningOrders,
                                                   CleaningOrders);
                    }
                    finally
                    {
                        fsCleaningOrders.Close();
                    }
                }
                else
                    Console.WriteLine("The cleaning orders could " +
                                      "not be retrieved");
            }
    
            public void OpenCleaningOrder()
            {
                bool foundReceipt = false;
    
                try
                {
                    Console.Write("Enter Receipt Number: ");
                    int recNumber = int.Parse(Console.ReadLine());
    
                    FileStream fsCleaningOrders = null;
                    BinaryFormatter bfCleaningOrders = new BinaryFormatter();
    
                    string strFilename =
                        @"C:\Georgetown Cleaning Services\CleaningOrders.gco";
    
                    if (File.Exists(strFilename))
                    {
                        try
                        {
                            fsCleaningOrders = new FileStream(strFilename,
                                                              FileMode.Open,
                                                              FileAccess.Read);
                            CleaningOrders =
                            (ArrayList)bfCleaningOrders.Deserialize(fsCleaningOrders);
                        }
                        finally
                        {
                            fsCleaningOrders.Close();
                        }
    
                        foreach (CleaningOrderDetails cod in CleaningOrders)
                        {
                            if (cod.ReceiptNumber == recNumber)
                            {
                                foundReceipt = true;
    
                                // Display the
                            Console.WriteLine("====================================");
                            Console.WriteLine("-/- Georgetown Cleaning Services -/-");
                            Console.WriteLine("====================================");
                            Console.WriteLine("Receipt #:   {0}", cod.ReceiptNumber);
                            Console.WriteLine("Customer:    {0}", cod.CustomerName);
                            Console.WriteLine("Home Phone:  {0}",
    					      cod.CustomerPhoneNumber);
                            Console.WriteLine("Order Date:  {0:D}", cod.OrderDate);
                            Console.WriteLine("Order Time:  {0:t}", cod.OrderTime);
                            Console.WriteLine("------------------------------------");
                            Console.WriteLine("Item Type   Qty Unit/Price Sub-Total");
                            Console.WriteLine("------------------------------------");
                            Console.WriteLine("Shirts      {0,3}   {1,4}      {2,6}",
                                              cod.NumberOfShirts,
                                              cod.PriceOneShirt,
                                              cod.SubTotalShirts);
                            Console.WriteLine("Pants       {0,3}   {1,4}      {2,6}",
                                              cod.NumberOfPants,
                                                 cod.PriceAPairOfPants,
                                                 cod.SubTotalPants);
                            Console.WriteLine("Other Items {0,3}   {1,4}      {2,6}",
                                                  cod.NumberOtherItems,
                                                  cod.PriceOtherItems,
                                                  cod.SubTotalOtherItems);
                            Console.WriteLine("------------------------------------");
                                Console.WriteLine("Total Order:   {0,6}",
                                                  cod.TotalOrder.ToString("C"));
                                Console.WriteLine("Tax Rate:      {0,6}",
                                                  cod.TaxRate.ToString("P"));
                                Console.WriteLine("Tax Amount:    {0,6}",
                                                  cod.TaxAmount.ToString("C"));
                                Console.WriteLine("Net Price:     {0,6}",
                                                  cod.SalesTotal.ToString("C"));
                            Console.WriteLine("====================================");
    
                                return;
                            } // if found receipt number
                        }// foreach
    
                        if (foundReceipt == false)
                            Console.WriteLine("No cleaning order with that " +
                                              "receipt number was found");
                    }// if file exists
                    else
                        Console.WriteLine("The cleaning orders were not found");
                }
                catch (FormatException)
                {
                    Console.WriteLine("Invalid Choice");
                }
            }
        }
    }
  7. Accédez au fichier Program.cs et changez le comme suit :
     
    using System;
    
    namespace GeorgetownCleaningServicesHatch1
    {
        class Program
        {
            static int Main(string[] args)
            {
                char answer = 'q';
                CleaningDeposit depotOrder = new CleaningDeposit();
    
                do
                {
                Console.WriteLine("================================================");
                    Console.WriteLine("Georgetown Cleaning Services");
                Console.WriteLine("================================================");
                    try
                    {
                        Console.WriteLine("What do you want to do?");
                        Console.WriteLine("1. Process a new cleaning order");
                        Console.WriteLine("2. Retrieve an existing order");
                        Console.WriteLine("0. Quit");
                        Console.Write("Your Choice: ");
                        answer = char.Parse(Console.ReadLine());
                    }
                    catch (FormatException)
                    {
                        Console.WriteLine("Invalid Answer");
                    }
    
                    switch (answer)
                    {
                        case '1':
                            depotOrder.ProcessOrder();
                            break;
    
                        case '2':
                            depotOrder.OpenCleaningOrder();
                            break;
    
                        default:
                            break;
                    }
                } while ((answer == '1') ||
                        (answer == '2'));
                Console.WriteLine();
                return 0;
            }
        }
    }
  8. Exécutez l'application pour l'examiner
  9. Créez d'abord quelques clients
  10. Traiter alors quelques commandes :
  11. Ouvrez une commande précédemment créée 
  12. Fermez la fenêtre DOS

Localiser un article dans un tableau haché

Localiser un article dans un tableau haché consiste à rechercher une clef, une valeur, ou une combinaison de Key=Value. La classe Hashtable est équipée pour effectuer ces opérations avec peu d'effort sur votre part. Si vous connaissez la clef d'un article mais voulez retrouver la valeur, vous pouvez utiliser la propriété index parce qu'elle la produit. Voici un exemple :

using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static int Main(string[] args)
        {
            Hashtable Chelsea20062007 = new Hashtable();

            Chelsea20062007.Add("Michael", "Ballack");
            Chelsea20062007.Add("Didier", "Drogba");
            Chelsea20062007["Claude"] = "Makelele";

            string Value = (string)Chelsea20062007["Didier"];
            Console.WriteLine("The value of the Didier key is {0}",
                              Value);

            Console.WriteLine();
            return 0;
        }
    }
}

Ceci produirait :

The value of the Didier key is Drogba

Press any key to continue . . .

Pour découvrir si un article Key=Value existe dans la liste, vous pouvez appele la rméthode Contains () . Sa syntaxe est :

public virtual bool Contains(object key);

Pour rechercher un article, passez sa clef comme argument à cette méthode. Voici un exemple:

using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static int Main(string[] args)
        {
            Hashtable Chelsea20062007 = new Hashtable();

            Chelsea20062007.Add("Michael", "Ballack");
            Chelsea20062007.Add("Didier", "Drogba");
            Chelsea20062007["Claude"] = "Makelele";

            Console.WriteLine("List of items");
            foreach (DictionaryEntry entry in Chelsea20062007)
                Console.WriteLine("{0} {1}", entry.Key, entry.Value);

            bool found = Chelsea20062007.Contains("Claude");

            if (found == true)
                Console.WriteLine("\nThe list contains an item " +
                                  "whose key is Claude");
            else
                Console.WriteLine("\nThe list doesn't contain an " +
                                  "item whose key is Claude");

            found = Chelsea20062007.Contains("James");

            if (found == true)
                Console.WriteLine("\nThe list contains an item " +
                                  "whose key is Claude");
            else
                Console.WriteLine("\nThe list doesn't contain an " +
                                  "item whose key is James");

            Console.WriteLine();
            return 0;
        }
    }
}

Ceci produirait :

List of items
Didier Drogba
Michael Ballack
Claude Makelele

The list contains an item whose key is Claude

The list doesn't contain an item whose key is James

Press any key to continue . . .

Pour découvrir si une clef particulière existe dans la liste, vous pouvez appeler la méthode ContainsKey () dont la syntaxe est :

public virtual bool ContainsKey(object key);

Pour découvrir si une clef particulière existe dans la liste, vous pouvez appeler la méthode ContainsKey () dont la syntaxe est :

public virtual bool ContainsValue(object key);

En appelant cette méthode, passer une Valeur  valeur comme argument. Voici un exemple :

using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static int Main(string[] args)
        {
            Hashtable Chelsea20062007 = new Hashtable();

            Chelsea20062007.Add("Michael", "Ballack");
            Chelsea20062007.Add("Didier", "Drogba");
            Chelsea20062007["Claude"] = "Makelele";

            Console.WriteLine("List of items");
            foreach (DictionaryEntry entry in Chelsea20062007)
                Console.WriteLine("{0} {1}", entry.Key, entry.Value);

            bool found = Chelsea20062007.ContainsValue("Makelele");

            if (found == true)
                Console.WriteLine("\nMakelele plays for Chelsea");
            else
                Console.WriteLine("\nMakelele doesn't plays for Chelsea");

            found = Chelsea20062007.ContainsValue("Fortune");

            if (found == true)
                Console.WriteLine("\nRonaldinho plays for Chelsea");
            else
                Console.WriteLine("\nRonaldinho doesn't plays for Chelsea");

            Console.WriteLine();
            return 0;
        }
    }
}

Ceci produirait :

List of items
Didier Drogba
Michael Ballack
Claude Makelele

Makele plays for Chelsea

Ronaldinho doesn't plays for Chelsea

Press any key to continue . . .

Supprimer des articles d'un tableau haché

Pour supprimer un article de la liste, vous pouvez appeler la méthode enlèvement (). Sa syntaxe est :

public virtual void Remove(object key);

Voici un exemple :

using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static int Main(string[] args)
        {
            Hashtable Chelsea20062007 = new Hashtable();

            Chelsea20062007.Add("Michael", "Ballack");
            Chelsea20062007.Add("Didier", "Drogba");
            Chelsea20062007["Claude"] = "Makelele";

            Console.WriteLine("List of items");
            foreach (DictionaryEntry entry in Chelsea20062007)
                Console.WriteLine("{0} {1}", entry.Key, entry.Value);

            Chelsea20062007.Remove("Didier");
            Console.WriteLine("\nThe item that contains " +
                              "Didier has been removed\n");

            Console.WriteLine("List of items");
            foreach (DictionaryEntry entry in Chelsea20062007)
                Console.WriteLine("{0} {1}", entry.Key, entry.Value);

            Console.WriteLine();
            return 0;
        }
    }
}

Ceci produirait :

List of items
Didier Drogba
Michael Ballack
Claude Makelele

The item that contains Didier has been removed

List of items
Michael Ballack
Claude Makelele

Press any key to continue . . .

Pour supprimer tous les articles de la liste, vous pouvez appeler la méthode Clear(). Sa syntaxe est :

public virtual void Clear();

C'est un exemple :

using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static int Main(string[] args)
        {
            Hashtable Chelsea20062007 = new Hashtable();

            Chelsea20062007.Add("Michael", "Ballack");
            Chelsea20062007.Add("Didier", "Drogba");
            Chelsea20062007["Claude"] = "Makelele";

            Console.WriteLine("List of items");
            foreach (DictionaryEntry entry in Chelsea20062007)
                Console.WriteLine("{0} {1}", entry.Key, entry.Value);

            Chelsea20062007.Clear();
            Console.WriteLine("\nThe list is now empty!");

            Console.WriteLine("List of items");
            foreach (DictionaryEntry entry in Chelsea20062007)
                Console.WriteLine("{0} {1}", entry.Key, entry.Value);

            Console.WriteLine();
            return 0;
        }
    }
}

Ceci produirait :

List of items
Didier Drogba
Michael Ballack
Claude Makelele

The list is now empty!
List of items

Press any key to continue . . .

 

 

Page d'Accueil Copyright © 2007-2008, Yevol