L'instruction .NET foreach garantit-elle l'itération d'une collection dans le même ordre que celui dans lequel elle a été construite?
-
03-07-2019 - |
Question
Un collègue a utilisé une boucle for pour itérer une liste dans un code C # qu'il a écrit et a laissé le commentaire, & "N'a pas utilisé For Each parce que je n'étais pas sûr qu'elle itère dans l'ordre. Qui sait ce que Microsoft fera? & Quot; Par exemple, supposons que nous ayons une liste construite comme ceci:
var someList = new List<string>();
someList.Add("one");
someList.Add("two");
someList.Add("three");
mon collègue a utilisé quelque chose comme ceci:
for (int i = 0; i < someList.Count; i++)
{
System.Diagnostics.Debug.WriteLine(someList[i]);
}
au lieu de ceci:
foreach (var item in someList)
{
System.Diagnostics.Debug.WriteLine(item);
}
Je suppose qu'il craint que les éléments ne sortent dans un ordre différent de celui qu'ils ont été ajoutés à la collection. Je pense qu'il est un peu paranoïaque, mais techniquement, la documentation n'indique pas l'ordre dans lequel la collection est itérée. Est-il possible pour une instruction foreach de parcourir un tableau ou un objet de collection dans un ordre autre que celui qui est lié du plus bas au plus élevé?
La solution
Votre question concerne un List<T>
qui maintient l'ordre.
Foreach, à lui seul, n’a aucune garantie de faire quoi que ce soit. Il demande simplement à l'objet prévu pour son énumérateur, qui pourrait tout faire, potentiellement.
Autres conseils
Cela dépend de la collection:
- Pour
List < T >
, l'ordre d'insertion est garanti. (Cela suppose uniquement que les appelsAdd
soient identiques à ceux illustrés. Si vous insérez des éléments dans la liste à des endroits particuliers, ils seront renvoyés au bon moment, comme vous le souhaiteriez.) En gros, c'est le même ordre que vous ' d obtenir en prenantliste [0]
,liste [1]
,liste [2]
etc. - Pour
Dictionnaire < TKey, TValue >
, vous ne pouvez pas garantir l'ordre. - Pour
SortedList < TKey, TValue >
(et ainsi de suite), l'ordre sera respecté - ce sera le type du type. - Les tableaux apparaissent toujours dans l'ordre des éléments.
Pour répondre spécifiquement à la question, "foreach". renvoie l'ordre renvoyé par le GetEnumerator (). Pour les listes, c'est l'ordre dans lequel vous avez ajouté des éléments à la fin. Pour les dictionnaires, c’est probablement l’ordre des compartiments où les choses ont été assignées.