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?

StackOverflow https://stackoverflow.com/questions/612486

  •  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é?

Était-ce utile?

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 appels Add 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 prenant liste [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.

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