Home

Les Indexeurs

 

Notions Fundamentales

 

Introduction

Un indexeur, également appelé une propriété indexée, est une catégorie de valeur qui vous permet d'accéder à une variable qui est membre d'une classe, en utilisant les caractéristiques d'un tableau. Pour créer une propriété indexée, commencez une classe n'importe laquelle. Dans le corps de la classe, créez une membre qui est un tableau.

Le tableau peut être d'un type primitif ou composite. Si vous voulez utiliser un type composite, vous pouvez utiliser un des nombreux type intégrés dans le .NET Framework ou vous devez d'abord créer votre classe. Voici un exemple:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Indexeur
{
    public enum Genres { Male, Femelle, Unknown };

    public class Personne
    {
        public int PersonneID;
        public string FirstName;
        public string LastName;
        public Genres Genre;
    }
}

Comme ceci l'indique, pour commencer à créer un indexeur, déclarez un tableau comme membre de la classe (ou structure). Voici un exemple:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Indexeur
{
    public class Personnes
    {
        Personne[] individue = new Personne[5];
    }
}

Dans le corps de la classe, créez un nom de propriété avec son(ses) accesseur(s). Cette propriété doit être le même type que le membre auquel il référera. La propriété doit être de type tableau et doit prendre un paramètre. Cela signifie qu'elle doit avoir des crochets. A l'intérieur des crochets, passez le paramètre que vous utiliserez comme index pour accéder aux membres du tableau.

Généralement, vous accédez aux membres d'un tableau entier en utilisant un index. Par conséquent, vous pouvez utiliser un paramètre de type int pour l'index du tableau. Bien sûr, l'indice paramètré doit avoir un nom, par exemple i. Cela serait fait comme suit:

namespace Indexeur
{
    public class Personnes
    {
        Personne[] individue = new Personne[5];

        public Personne this[int i]
        {
        }
    }
}

Si vous voulez que la propriété soit uniquely lue, ne créez que l'accesseur get. Dans l'accesseur, vous devez retourner l'élément de tableau auquel la propriété référre, en utilisant le paramètre de la propriété. Cela serait fait comme suit:

namespace Indexeur
{
    public class Personnes
    {
        Personne[] individue = new Personne[5];

        public Personne this[int i]
        {
            get { return individue[i]; }
        }
    }
}

Si vous voulez créer un indexeur qui peut uniquement recevoir des valeurs, créez seulment un accesseur set. Voici un exemple:

namespace Indexeur
{
    public class Personnes
    {
        Personne[] individue = new Personne[5];

        public Personne this[int i]
        {
            set { individue[i] = value; }
        }
    }
}

Si vous voulez créer une propriété indexée qui peut recevoir ou fournir des valeurs, créez l'indexeur avec les deux accesseurs. Voici un exemple:

namespace Indexeur
{
    public class Personnes
    {
        Personne[] individue = new Personne[5];

        public Personne this[int i]
        {
            get { return individue[i]; }
            set { individue[i] = value; }
        }
    }
}

Après la création d'un indexeur pour lecture/écriture, vous pouvez utiliser ses valeurs en dehors de la classe. En d'autres termes, les clients de la classe peut modifier les valeurs de l'indexeur. Rappelez-vous que l'avantage d'une propriété indexée est que chaque membre de la classe peut être accessible à partir de l'instance de la classe en appliquant directement les crochets et l'index. Voici un exemple:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Indexeur
{
    public partial class Exercice : Form
    {
        public Exercise()
        {
            InitializeComponent();
        }

        private void Exercice_Load(object sender, EventArgs e)
        {
            Personnes People = new Personnes();

            People[0] = new Personne()
            {
                PersonneID = 72947, Genre = Genres.Femelle,
                FirstName = "Paulette", LastName = "Cranston"
            };
            
            People[1] = new Personne()
            {
                PersonneID = 70854, Genre = Genres.Male,
                FirstName = "Harry", LastName = "Kumar"
            };
            
            People[2] = new Personne()
            {
                PersonneID = 27947, Genre = Genres.Male,
                FirstName = "Jules", LastName = "Davidson"
            };
            
            People[3] = new Personne()
            {
                PersonneID = 62835, Genre = Genres.Unknown,
                FirstName = "Leslie", LastName = "Harrington"
            };
            
            People[4] = new Personne()
            {
                PersonneID = 92958, FirstName = "Ernest",
                LastName = "Colson", Genre = Genres.Male
            };

            for (int i = 0; i < 5; i++ )
            {
                ListViewItem lviPersonne = 
			new ListViewItem(People[i].PersonneID.ToString());

                lviPersonne.SubItems.Add(People[i].FirstName);
                lviPersonne.SubItems.Add(People[i].LastName);
                lviPersonne.SubItems.Add(People[i].Genre.ToString());

                lvwPersonnes.Items.Add(lviPersonne);
            }
        }
    }
}

Ceci produirait:

Array

Indexeurs sur Tableaux et Collections

Lors de l'utilisation d'indices de propriété dont le membre est de type tableau, vous pouvez accéder seulement à concurrence du nombre des éléments précisés lors de la création de l'indexeur. Dans notre exemple, ce serait 5. Si vous essayez d'accéder à plus d'éléments que cela, vous devriez recevoir une exception de type IndexOutOfRangeException. Et parce que, lors de l'utilisation de la propriété indexée, le membre est considéré comme une classe normale et non un tableau, vous ne pouvez pas appeler la méthode Resize() de la classe Array pour augmenter le nombre d'éléments que la variable peut contenir. Si vous voulez aller au-delà du nombre d'éléments spécifiés surtout, vous avez différentes possibilités. Vous pouvez spécifier un plus grand nombre d'éléments lors de la création de l'indexeur. Voici un exemple:

namespace Indexeur
{
    public class Personnes
    {
        Personne[] individue = new Personne[100];

        public Personne this[int i]
        {
            get { return individue[i]; }
            set { individue[i] = value; }
        }
    }
}

L'inconvénient de cette approche est que chaque fois que ce programme fonctionne, il utilisera plus de mémoire que nécessaire. Bien sûr, cette technique ne sera pas considérer comme professionnelle pour résoudre ce genre de problème. Une autre solution consiste à créer vos propres moyens d'augmenter le nombre d'éléments que la variable peut contenir. Voici un exemple:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Indexeur
{
    public class Personnes
    {
        Personne[] individue = new Personne[5];

        public Personne this[int i]
        {
            get { return individue[i]; }
            set { individue[i] = value; }
        }

        public void Augmenter()
        {
            Array.Resize<Personne>(ref individue, individue.Length + 5);
        }
    }
}

Après avoir fait cela, chaque fois que vous savez que vous êtes sur le point d'accéder à un plus grand nombre d'éléments, vous pouvez simplement appliquer les moyens d'accroître la taille. Voici un exemple:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Indexeur
{
    public partial class Exercice : Form
    {
        public Exercise()
        {
            InitializeComponent();
        }

        private void Exercice_Load(object sender, EventArgs e)
        {
            Personnes People = new Personnes();

            People[0] = new Personne()
            {
                PersonneID = 72947, Genre = Genres.Femelle,
                FirstName = "Paulette", LastName = "Cranston"
            };
            
            People[1] = new Personne()
            {
                PersonneID = 70854, Genre = Genres.Male,
                FirstName = "Harry", LastName = "Kumar"
            };
            
            People[2] = new Personne()
            {
                PersonneID = 27947, Genre = Genres.Male,
                FirstName = "Jules", LastName = "Davidson"
            };
            
            People[3] = new Personne()
            {
                PersonneID = 62835, Genre = Genres.Unknown,
                FirstName = "Leslie", LastName = "Harrington"
            };
            
            People[4] = new Personne()
            {
                PersonneID = 92958, FirstName = "Ernest",
                LastName = "Colson", Genre = Genres.Male
            };

            People.Augmenter();

            People[5] = new Personne()
            {
                PersonneID = 91749, FirstName = "Patricia",
                LastName = "Katts", Genre = Genres.Femelle
            };
            
            People[6] = new Personne()
            {
                PersonneID = 29749, FirstName = "Patrice",
                LastName = "Abanda", Genre = Genres.Unknown
            };
            
            People[7] = new Personne()
            {
                PersonneID = 24739, FirstName = "Frank",
                LastName = "Thomasson", Genre = Genres.Male
            };

            for (int i = 0; i < 8; i++ )
            {
                ListViewItem lviPersonne = 
			new ListViewItem(People[i].PersonneID.ToString());

                lviPersonne.SubItems.Add(People[i].FirstName);
                lviPersonne.SubItems.Add(People[i].LastName);
                lviPersonne.SubItems.Add(People[i].Genre.ToString());

                lvwPersonnes.Items.Add(lviPersonne);
            }
        }
    }
}

Ceci produirait:

Tableaux

Une autre alternative à ce problème consiste à créer l'indexeur comme une collection.

Propriétés Multi-Paramètres et Indexeurs

Au lieu d'un seul paramètre, vous pouvez créer une propriété indexée qui prend plus d'un paramètre. Pour commencer, vous pouvez déclarer le tableau comme un membre d'une classe. Après avoir déclaré le tableau, créer une propriété qui prend les paramètres. Dans le corps d'un accesseur (get ou set), utilisez le paramètre approprié comme bon vous semble. Au minimum, pour obtenir un accesseur, vous pouvez retourner la valeur du tableau en utilisant les paramètres basés sur les règles d'un tableau d'une ou deux dimensions. Voici un exemple pour une propriété indexée qui se rapporte à un tableau d'une ou deux dimensions:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Indexeur
{
    public class Personnes
    {
        Personne[, ] individue = new Personne[2, 4];

        public Personne this[int i, int j]
        {
            get { return individue[i, j]; }
            set { individue[i, j] = value; }
        }
    }
}

 Après avoir créé la propriété, vous pouvez accéder à chaque élément du tableau en appliquant les crochets à une instance de la classe. Voici un exemple:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Indexeur
{
    public partial class Exercice : Form
    {       
        public Exercise()
        {
            InitializeComponent();
        }

        private void Exercice_Load(object sender, EventArgs e)
        {
            Personnes People = new Personnes();

            People[0, 0] = new Personne()
            {
                PersonneID = 72947, Genre = Genres.Femelle,
                FirstName = "Paulette", LastName = "Cranston"
            };
            
            People[0, 1] = new Personne()
            {
                PersonneID = 70854, Genre = Genres.Male,
                FirstName = "Harry", LastName = "Kumar"
            };
            
            People[0, 2] = new Personne()
            {
                PersonneID = 27947, Genre = Genres.Male,
                FirstName = "Jules", LastName = "Davidson"
            };
            
            People[0, 3] = new Personne()
            {
                PersonneID = 62835, Genre = Genres.Unknown,
                FirstName = "Leslie", LastName = "Harrington"
            };
            
            People[1, 0] = new Personne()
            {
                PersonneID = 92958, FirstName = "Ernest",
                LastName = "Colson", Genre = Genres.Male
            };

            People[1, 1] = new Personne()
            {
                PersonneID = 91749, FirstName = "Patricia",
                LastName = "Katts", Genre = Genres.Femelle
            };
            
            People[1, 2] = new Personne()
            {
                PersonneID = 29749, FirstName = "Patrice",
                LastName = "Abanda", Genre = Genres.Unknown
            };
            
            People[1, 3] = new Personne()
            {
                PersonneID = 24739, FirstName = "Frank",
                LastName = "Thomasson", Genre = Genres.Male
            };

            for (int i = 0; i < 2; i++ )
            {
                for (int j = 0; j < 4; j++)
                {
                    ListViewItem lviPersonne = 
			new ListViewItem(People[i, j].PersonneID.ToString());

                    lviPersonne.SubItems.Add(People[i, j].FirstName);
                    lviPersonne.SubItems.Add(People[i, j].LastName);
                    lviPersonne.SubItems.Add(People[i, j].Genre.ToString());

                    lvwPersonnes.Items.Add(lviPersonne);
                }
            }
        }
    }
}

Rappelez-vous que l'une des plus précieuses caractéristiques d'une propriété indexée est que, lors de la création, vous pouvez la faire retourner tout type primitif et vous pouvez la faire prendre n'importe quel paramètre de votre choix. Aussi, les paramètres d'une propriété indexée multi-paramètres n'ont pas à être du même type. L'un peut être du type Personne tandis que l'autre est du type bool. L'un peut être un double alors que l'autre est un short. Lors de la définition de la propriété, vous devez appliquer les règles des méthodes et des tableaux.

Download:

Indexeurs

 

 
 
 
 

Accueil Copyright © 2009, yevol.com