Question

Est-il prudent de supposer que deux itérations sur la même collection renverront les objets dans le même ordre? De toute évidence, on suppose que la collection n'a pas été modifiée autrement.

Était-ce utile?

La solution

Réponse courte - oui.

Évidemment, l'ordre des éléments de la collection peut ne pas être identique à celui où ils ont été insérés, en fonction du type de collection (un dictionnaire, par exemple).

Mais vous obtiendrez les mêmes résultats chaque fois que vous parcourez une seule collection non modifiée à l'aide d'une boucle foreach.

Autres conseils

Cela dépend du type de collection. Pour la plupart des collections, la réponse est & "Oui &";

Cependant, cela n’est pas garanti. Les documents d'un type de collection doivent spécifier si c'est le cas ou non, mais comme la plupart des gens le font, ces détails sont généralement examinés. Toutefois, s’il n’est pas stable, ce serait une énorme perte de contrôle si les documents ne le mentionnaient pas.

Vous ne pouvez pas garantir cette information à moins de connaître l’implémentation concrète de la classe sur laquelle vous revenez.

Les collections qui ont un ordre défini d'éléments (par exemple, List<T>) seront énumérées dans un ordre stable.

Pour les collections dans lesquelles l'état de l'objet ne change pas, il est fort probable que les éléments reviennent dans le même ordre, par exemple. Dictionary<K,V>, bien que cela ne soit pas garanti par la spécification.

Comme exemple de ce qui ne serait pas le cas, vous pouvez imaginer une implémentation de dictionnaire basée sur une table de hachage qui compacte ou redimensionne la table de manière asynchrone. Une telle implémentation ne garantirait pas un ordre d’itération stable.

Alors que la réponse est & # 8220; oui & # 8221; pour toutes les collections internes et probablement pour toute classe de collection saine, la documentation ne contient aucune contrainte formulée pour IEnumerable. Par conséquent, rien ne nous dit que chaque itération doit être stable.

Je pourrais imaginer le cas d'utilisation suivant:

foreach (int i in new Shuffler(1, 2, 3, 4, 5, 6, 7, 8, 9))
    Console.WriteLine(i);

Cela pourrait très bien être implémenté en tant que classe produisant un ordre différent pour chaque itération.

Donc & # 8211; si vous souhaitez également prendre en compte des cas limites étranges, la réponse doit être & # 8220; non & # 8221;.

Bien que les éléments soient généralement renvoyés dans le même ordre, il n’ya aucune garantie. Cela dépend entièrement de l'implémentation interne de la classe de collection.

Je peux voir le cas d'une classe de collection spécialement conçue pour renvoyer des éléments dans un ordre aléatoire, par exemple.

En bref, si vous ne connaissez pas l'implémentation interne de la classe de collection, ne supposez rien de la commande.

Linq définit à cette fin l'interface IOrderedEnumerable .

Re " non modifié " (Réponse de NM) - notez que de nombreux conteneurs complexes comme Dictionary ne garantissent pas le maintien de l'ordre. Parfois, l'ajout d'un élément le fera apparaître en dernier (ce qui donne l'impression que l'ordre est préservé), et parfois, les compartiments internes se réorganisent pour donner un ordre complètement différent.

Des choses comme SortedList <, > etc ont évidemment leurs propres règles.

Je dirais que pour la plupart des collections, il est prudent de supposer cela. Il n’est pas impossible que l’énumérateur soit mis en œuvre dans une collection donnée d’une manière non déterministe, mais cela ne se produira probablement pas ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top