73 votes

Une List<T> garantit-elle que les éléments seront renvoyés dans l'ordre où ils ont été ajoutés ?

Est-ce qu'un List<T> garantit toujours que les éléments seront restitués dans l'ordre dans lequel ils ont été ajoutés lors de l'énumération ?

Mise à jour : Merci pour toutes les réponses, cela me rassure. J'ai jeté un coup d'œil rapide sur le site List<T> avec .NET Reflector (j'aurais probablement dû le faire dès le départ) et en effet le magasin sous-jacent est un tableau de T ( T[] ).

60voto

Sander Versluys Points 13953

La liste est basée sur un index et les nouveaux éléments seront toujours ajoutés à la fin de la liste. Vous pouvez insérer des éléments à un certain index de sorte que les éléments suivants se déplacent d'une position.

Donc oui vous pouvez l'utiliser en toute sécurité de cette façon...

La classe List(T) est la classe générique de la classe ArrayList. Elle met en œuvre l'interface générique IList(T) en utilisant un tableau dont la taille est dont la taille est augmentée dynamiquement en fonction des besoins.

Les éléments de cette collection peuvent être accessibles à l'aide d'un index de nombres entiers. Les index de cette collection sont basés sur des zéros.

La liste(T) n'est pas garantie d'être triée. Vous devez trier la Liste(T) avant d'effectuer des opérations (telles que BinarySearch) qui nécessitent le tri de List(T) soit triée.

Une liste(T) peut supporter plusieurs lecteurs simultanément, à condition que le paramètre n'est pas modifiée. L'énumération dans une collection n'est intrinsèquement pas une procédure thread-safe. Dans les rares cas où une procédure d'énumération se heurte à un ou plusieurs accès en écriture, le seul moyen d'assurer la est de verrouiller la collection pendant toute la durée de l'énumération. l'énumération. Pour permettre à plusieurs threads d'accéder à la collection d'être accessible par plusieurs threads pour lecture et l'écriture, vous devez implémenter votre propre synchronisation.

Pour en savoir plus, consultez le site MSDN .

7voto

Alex Angas Points 20408

Oui, List<T> garanties l'ordre d'insertion et l'ordre d'extraction et ceci est documenté sur MSDN (l'accent ci-dessous est le mien).

Insertion

List<T>.Add Méthode

Ajoute un objet à la base de données fin de la List<T> .

Le paramètre de l'article est :

L'objet à ajouter au fin de la List<T> .

List<T>.AddRange Méthode

Ajoute les éléments de la collection spécifiée à la collection fin de la List<T> .

Le paramètre de collecte est :

La collection dont les éléments doivent être ajoutés au fin de la List<T> .

Récupération

List<T>.Enumerator Structure

Initialement, l'énumérateur est placé avant le premier élément de la collection. A cette position, Current n'est pas défini. Par conséquent, vous devez appeler MoveNext pour faire avancer l'énumérateur jusqu'à l'étape premier élément de la collection avant de lire la valeur de Current .

Current renvoie le même objet jusqu'à ce que MoveNext est appelé. MoveNext ensembles Current à la élément suivant .

4voto

Mitch Wheat Points 169614

Oui, mais cela ne fait pas partie de la spécification.

Réf : Classe de liste

1voto

Spencer Ruport Points 24589

Oui, d'après ce document Fil de discussion du forum MSDN

-2voto

Nemezis Points 1

Toutes les réponses à cette question sont fausses. La liste ne garantit pas l'ordre de récupération ; par conséquent, la question de l'ordre d'insertion est sans objet. Dans les tests réels, l'ordre d'extraction peut ou non être identique à l'ordre d'insertion. Cependant, Microsoft dispose de collections qui garantissent l'ordre d'extraction, mais ne les expose pas aux développeurs. Ces collections sont toutes les *ItemCollections utilisées dans les contrôles GUI Winforms.

Je me suis débattu avec la question de l'ordre d'insertion et d'extraction des listes et j'ai rencontré un problème qui fait que même le Insert(list.Count, item) Les nouveaux éléments se sont retrouvés en position zéro lors de l'extraction, ce qui est inutile de le préciser. Add o Append et la seule solution a été d'abandonner le databinding et d'utiliser Add directement dans la fenêtre de contrôle Items . Cela a permis de résoudre le problème. Microsoft aime apparemment nous torturer et nous induire en erreur, dans sa quête perpétuelle de mauvais karma.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X