web-dev-qa-db-fra.com

Itérer une liste d'objets avec foreach

Je suis tombé sur cette déclaration:

"Lors de l'utilisation de foreach sur une liste d'objets, l'instance d'objet itéré n'est pas éditable, mais les propriétés de l'objet are éditable"

Quelqu'un pourrait-il démontrer ce qui précède avec un exemple simple, s'il vous plaît?

Permettez-moi de reformuler (comme j'ai trouvé la déclaration en deux versions), cette déclaration est peut-être plus claire:

"Lors de l'utilisation de foreach sur une liste d'éléments, la variable d'itération qui fournit l'élément est en lecture seule, mais les propriétés de l'élément sont modifiables"

4
cnom
foreach(var foo in foos)
{
  foo = null; // WRONG, foo is not editable
  foo.name = "John";  // RIGHT, foo properties are editable
}
9
user6522773

Cela signifie que les éléments de la liste ne peuvent pas changer lors de l'itération, mais que leur contenu peut l'être.

cela modifiera la collection et empêchera le foreach de terminer:

foreach(var item in collection)
{
   collection.Remove(item);
}

Cela modifiera un élément de la liste et n'empêchera pas le foreach de compléter:

foreach(var item in collection)
{
    item.name = "Neil";
}
1
Neil

Oui

Foreach (n in list) if (n.something==true) list.Remove(n);

cela va échouer

vous ne pouvez pas supprimer un élément de la liste, contrairement à une boucle for

0
BugFinder
foreach var car in cars 
{
    //you can edit car.color here
    //you cannot edit car
}
0
lolex

Vous n'êtes pas sûr d'avoir besoin d'un exemple pour cela. Vous allez enjamber chaque objet de la collection et vous pouvez faire ce que vous voulez pour chacun de ces objets, mais vous ne pouvez pas modifier la collection elle-même, par exemple. Insert, Remove, Clear, etc. Une telle tentative lèvera une exception.

0
LordWilmore