|
Fondamentaux du soutien de .NET pour les collections |
|
|
Énumération des membres d'une collection |
|
Introduction aux collections de système |
|
En étudiant les rangées, nous avons vu que vous pourriez utiliserla boucle for pour visiter chaque membre d'une rangée. Ceci a été également fait avec l'aide de l'opérateur []. Dans la leçon précédente, nous avons vu que, en créant une collection, vous devriez fournir une méthode qui vous permet de rechercher un membre de la collection. Dans les deux cas, vous pouvez énumérer les membres d'une rangée ou d'une collection par une technique appelée une énumération. L'énumération d'une collection consiste à visiter chaque membre de la liste, pour n'importe quelle raison jugée nécessaire. Par exemple, vous pouvez énumérer une collection pour qfficher une liste de ses membres. Vous pouvez énumérer une collection en recherchant un membre qui répond à un certain critère. En outre, ou au lieu de la boucle for, .NET Framework fournit des autres et mieux l'appui pour l'énumération. Dans la langue de C#, vous pouvez énumérer une collection en utilisant l'opérateur de foreach, mais la collection doit être préparée pour elle : vous ne pouvez pas simplement n'employer le foreach pour aucune collection. Cet appui est fourni par deux interfaces principales : IEnumerator et IEnumerable. Ces deux interfaces sont définies dans le namespace de System.Collection. Par conséquent, si vous avez l'intention de les employer, vous pouvez inclure ce namespace dans votre fichier source. |
|
|
Si votre collection est une liste ranger-basée, vous pouvez commencer par déclarer la rangée basse dans la classe : Voici un exemple : public class Enumerator : IEnumerator
{
private double[] numbers;
}
Si la collection ranger-n'est pas basée, vous pouvez déclarer une variable pour la classe qui serait énumérée. Le rôle de l'agent recenseur est d'agir sur une collection. Pour cette raison, la classe devrait être préparée pour recevoir une collection externe. Ceci peut être fait en la passant à un constructeur de l'agent recenseur. Voici un exemple : public class Enumerator : IEnumerator
{
private double[] numbers;
public Enumerator(double[] list)
{
}
}
La collection interne serait employée dans la classe d'agent recenseur. La collection externe serait la source des valeurs de la liste qui serait agent recenseur. Pour ces raisons, vous pouvez devriez initialiser la collection interne avec les valeurs de la liste externe. Ceci peut être fait comme suit : public class Enumerator : IEnumerator
{
private double[] numbers;
public Enumerator(double[] list)
{
this.numbers = list;
}
}
Dans la leçon précédente, en présentant quelques techniques de créer une liste, nous avons vu que vous devriez avoir un type d'étiquette, comme champ, qui te permet de surveiller l'article qui est actuellement accédé ou employé dans la liste. C'est particulièrement valable en rendant visite aux membres de la collection. L'interface d'IEnumerator fournit une propriété qui est employée pour identifier le membre courant de la liste. Cette propriété s'appelle Current. Puisque l'article courant est censé pour être regardé seulement, la propriété courante est inaltérable. Basé sur les règles de la classe abstraite, se rappeler que vous devez mettre en application tous les membres d'une interface dans la classe qui est basée sur elle. Pour mettre en application la propriété courante, vous pouvez mettre en application le son obligez l'accédant à renvoyer l'article à la position actuelle. Ceci peut être fait comme suit : public class Enumerator : IEnumerator
{
private double[] numbers;
private int cur;
public Enumerator(double[] list)
{
this.numbers = list;
}
public Object Current
{
get { return numbers[cur]; }
}
}
Bien que vous devriez pouvoir identifier l'article courant à tout moment, quand l'application commence, avant que la collection puisse être énumérée, l'étiquette qui est employée pour surveiller l'article courant devrait être placée à avant le commencement du compte. Ceci peut être fait en plaçant l'étiquette à -1. Voici un exemple : 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]; }
}
}
Tandis que la collection est, à un moment vous pouvez vouloir remettre à zéro l'étiquette de l'article courant dans sa position originale. Pour soutenir cette opération, l'IEnumerator est équipé d'une méthode appelée Reset. Sa syntaxe est : void Reset() ; En appliquant cette méthode, assigner simplement une valeur non-existante, qui est habituellement -1, à l'étiquette de surveillance de l'article courant. Ceci peut être fait comme suit : 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;
}
}
En utilisant l'applicateur de l'interface d'IEnumerator, si vous essayez d'accéder à un article au delà du nombre maximum des articles, le compilateur jetterait une exception d'IndexOutOfRangeException. Pour cette raison, en prévoyant un mauvais comportement, vous devriez attraper cette exception quand mettant en application la propriété courante.
Dans la leçon précédente, nous avons vu que, en utilisant les articles d'une collection, one-way que vous pouvez localiser un article des autres est de pouvoir sauter d'un article au prochain. Cette opération est également très importante en énumérant une collection. Pour soutenir cette opération, l'IEnumerator est raillé avec la méthode de MoveNext (). Sa syntaxe est: bool MoveNext () ; En appliquant cette méthode, incrémenter d'abord l'étiquette qui surveille l'article courant de la collection. Après incrémentation de l'étiquette, contrôle s'il est inférieur que tout le nombre d'articles. S'il est, renvoyer vrai. Autrement, renvoyer faux. Ceci peut être fait comme suit : 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;
}
}
|
|
|
||
| Précédent | Copyright © 2007, Yevol | Suivant |
|
|
||