Page d'Accueil

Une Collection Enumérable

 

Introduction

L'interface d'IEnumerator est employée pour établir une collection pour l'énumération. L'IEnumerator ne fournit pas la fonctionnalité nécessaire pour employer le foreach. La prochaine étape est de mettre en application une autre interface appelée IEnumerable. Tandis que l'interface d'IEnumerator est employée pour identifier la classe qui tient chaque valeur qui sera visitée, l'interface d'IEnumerable est employée pour communiquer avec la collection dont les articles seront énumérés. Pour cette raison, en mettant en application cette classe, vous devriez fournir les moyens d'accéder à la collection externe. Ceci peut être fait en passant une collection de la classe qui tient les valeurs, à un constructeur de l'applicateur d'IEnumerable.

 

Obtenir l'agent recenseur

Pour mettre en application l'interface d'IEnumerable, commencer par dériver une classe à partir de elle. Tandis que la classe mise en application par l'interface d'IEnumerator représente un objet, la classe qui met en application l'IEnumerable est une collection. Voici un exemple :

public class Enumerable : IEnumerable
{
}

Noter que la nouvelle classe ne connaît pas quelle collection on lui invitera à énumérer. Pour cette raison, dans la nouvelle classe, vous devriez déclarer une variable de membre de la classe qui tient les valeurs qui seront énumérées. Si la collection ranger-est basée, vous pouvez créer le champ comme suit :

public class Enumerable : IEnumerable
{
    private double[] numbers;
}

Par la suite, quand instantiating l'applicateur d'IEnumerable, vous devrez lui passer une collection de valeurs. Pour faire ce possible, vous pouvez créer une méthode dans la nouvelle classe et lui passer cette collection d'objets. Voici un exemple:

public class Enumerable : IEnumerable
{
    private double[] numbers;

    public void Identify(double[] values)
    {
    }
}

Dans cette méthode, vous pouvez assigner la variable de membre à l'argument. Vous devriez également affecter chaque membre de l'argument à son équivalent du membre de l'argument. Ceci peut être fait comme suit :

public class Enumerable : IEnumerable
{
    private double[] numbers;

    public void Identify(double[] values)
    {
        numbers = values;
        for (int i = 0; i < values.Length; i++)
            numbers[i] = values[i];
    }
}

Pour soutenir l'utilisation de la boucle de foreach, l'interface d'IEnumerable est équipée (seulement) d'une méthode appelée GetEnumerator que vous devez mettre en application. La méthode d'IEnumerable.GetEnumerator () renvoie un objet d'IEnumerator. En appliquant cette méthode, vous pouvez renvoyer un objet de la classe qui met en application l'interface d'IEnumerator, lui passant la collection qui a été déclarée dans l'applicateur d'IEnumerable. Ceci peut être fait comme suit : 

public class Enumerable : IEnumerable
{
    private double[] numbers;

    public void Identify(double[] values)
    {
        numbers = values;
        for (int i = 0; i < values.Length; i++)
            numbers[i] = values[i];
    }

    public IEnumerator GetEnumerator()
    {
        return new Enumerator(numbers);
    }
}

Étude pratique Étude pratique : Obtenir l'agent recenseur

  1. Créer une nouvelle classe, dans la vue de classe, droit-cliquent FlowerShop5 - > ajouter - > classe…
  2. Placer le nom de la classe aux fleurs et le clic s'ajoutent
  3. Changer le dossier comme suit :
     
    using System;
    using System.Collections;
    
    namespace FlowerShop5
    {
        public class Flowers : IEnumerable
        {
            private FlowerInventory items;
    
            public void Locate(FlowerInventory list)
            {
                items = new FlowerInventory();
    
                for (int i = 0; i < list.Count; i++)
                    this.items.Add(list.Get(i));
            }
    
            public IEnumerator GetEnumerator()
            {
                FlowerIdentifier fid = new FlowerIdentifier();
    
                fid.Identify(items);
                return fid; 
            }
        }
    }
  4. Économiser le dossier

Employer le foreach

Après avoir mis en application l'IEnumerator et les interfaces d'IEnumerable, vous pouvez alors employer la boucle de foreach. Pour commencer, vous devez préparer la collection et ses articles pour le traitement. Voici un exemple :

class Program
{
    static int Main(string[] args)
    {
        double[] numbers = new double[5];
        numbers[0] = 224.52;
        numbers[1] = 60.48;
        numbers[2] = 1250.64;
        numbers[3] = 8.86;
        numbers[4] = 1005.36;

        return 0;
    }
}

Pour énumérer la collection, déclarer une variable basée sur l'applicateur de l'IEnumerable et passer la collection à son constructeur. Une fois que ceci est fait, vous pouvez alors utilisateur le foreach. Voici un exemple :

using System;
using System.Collections;

public class Enumerator : IEnumerator
{
    private double[] numbers;
    private int cur;

    public Enumerator(double[] list)
    {
        this.numbers = list;
        cur = -1;
    }

    public Object Current
    {
        get { return numbers[cur]; }
    }

    public void Reset()
    {
        cur = -1;
    }

    public bool MoveNext()
    {
        cur++;
        if (cur < numbers.Length)
            return true;
        else
            return false;
    }
}

public class Enumerable : IEnumerable
{
    private double[] numbers;

    public void Identify(double[] values)
    {
        numbers = values;
        for (int i = 0; i < values.Length; i++)
            numbers[i] = values[i];
    }

    public IEnumerator GetEnumerator()
    {
        return new Enumerator(numbers);
    }
}

class Program
{
    static int Main(string[] args)
    {
        double[] numbers = new double[5];
        numbers[0] = 224.52;
        numbers[1] = 60.48;
        numbers[2] = 1250.64;
        numbers[3] = 8.86;
        numbers[4] = 1005.36;

        Enumerable coll = new Enumerable();
        
        coll.Identify(numbers);
        foreach (double d in coll)
            Console.WriteLine("Item {0}", d); ;

        return 0;
    }
}

Étude pratique Étude pratique : Employer le foreach sur un agent recenseur

  1. L'Access le dossier de Program.cs et le changent comme suit :
     
    using System;
    
    namespace FlowerShop5
    {
        class Program
        {
            static int Main(string[] args)
            {
                FlowerInventory fls = new FlowerInventory();
                Flower nice;
    
                nice = new Flower();
                nice.Type = FlowerType.Lilies;
                nice.Color = FlowerColor.White;
                nice.Arrangement = FlowerArrangement.Bouquet;
                nice.UnitPrice = 39.95M;
                fls.Add(nice);
    
                nice = new Flower();
                nice.Type = FlowerType.Daisies;
                nice.Color = FlowerColor.Mixed;
                nice.Arrangement = FlowerArrangement.Bouquet;
                nice.UnitPrice = 40.50M;
                fls.Add(nice);
    
                nice = new Flower();
                nice.Type = FlowerType.Carnations;
                nice.Color = FlowerColor.Lavender;
                nice.Arrangement = FlowerArrangement.Any;
                nice.UnitPrice = 34.85M;
                fls.Add(nice);
    
                nice = new Flower();
                nice.Type = FlowerType.Roses;
                nice.Color = FlowerColor.Pink;
                nice.Arrangement = FlowerArrangement.Bouquet;
                nice.UnitPrice = 29.95M;
                fls.Add(nice);
    
                nice = new Flower();
                nice.Type = FlowerType.Daisies;
                nice.Color = FlowerColor.Yellow;
                nice.Arrangement = FlowerArrangement.Vase;
                nice.UnitPrice = 29.95M;
                fls.Add(nice);
    
                Flowers collection = new Flowers();
                collection.Locate(fls);
    
                Console.WriteLine("//=//=//=//=//=//=//=//=//=//=//=//=//=//=//");
                Console.WriteLine("Total: {0} flower items in current inventory",
                    fls.Count);
                Console.WriteLine("--------------------------------------------");
                Console.WriteLine("Inventory Summary");
                foreach (Flower flr in collection)
                {
                    Console.WriteLine("------------------------");
                    Console.WriteLine("Flower Information");
                    Console.WriteLine("Type:        {0}", flr.Type);
                    Console.WriteLine("Color:       {0}", flr.Color);
                    Console.WriteLine("Arrangement: {0}", flr.Arrangement);
                    Console.WriteLine("Unit Price:  {0:F}", flr.UnitPrice);
                }
                Console.WriteLine("//=//=//=//=//=//=//=//=//=//=//=//=//=//=//");
                return 0;
            }
        }
    }
  2. Exécuter l'application pour voir le résultat :
     
    //=//=//=//=//=//=//=//=//=//=//=//=//=//=//
    Total: 5 flower items in current inventory
    --------------------------------------------
    Inventory Summary
    ------------------------
    Flower Information
    Type:        Lilies
    Color:       White
    Arrangement: Bouquet
    Unit Price:  39.95
    ------------------------
    Flower Information
    Type:        Daisies
    Color:       Mixed
    Arrangement: Bouquet
    Unit Price:  40.50
    ------------------------
    Flower Information
    Type:        Carnations
    Color:       Lavender
    Arrangement: Any
    Unit Price:  34.85
    ------------------------
    Flower Information
    Type:        Roses
    Color:       Pink
    Arrangement: Bouquet
    Unit Price:  29.95
    ------------------------
    Flower Information
    Type:        Daisies
    Color:       Yellow
    Arrangement: Vase
    Unit Price:  29.95
    //=//=//=//=//=//=//=//=//=//=//=//=//=//=//
    Press any key to continue . . .
  3. Fermer la fenêtre de DOS
 

Précédent Copyright © 2007, Yevol Suivant