Si votre collection contient des types de référence, vous pouvez modifier ses éléments en place en utilisant une méthode d'extension, similaire à la méthode ForEach
sur List<T>
.
Ceci est possible car vous n'essayez pas réellement de modifier la séquence IEnumerable<T>
: La collection contient des références mais vous ne modifiez que les objets référencés, pas les références elles-mêmes.
Cette technique ne fonctionnera pas pour les collections de types de valeur. Dans ce cas, vous essayez de modifier la séquence IEnumerable<T>
en lecture seule, ce qui n'est pas possible.
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (T item in source)
{
action(item);
}
}
// ...
public class Example
{
public int Value { get; set; }
}
// ...
Example[] examples =
{
new Example { Value = 1 }, new Example { Value = 2 },
new Example { Value = 3 }, new Example { Value = 4 }
};
examples.ForEach(x => x.Value *= 2);
// displays 2, 4, 6, 8
foreach (Example e in examples)
{
Console.WriteLine(e.Value);
}
Merci, même chose pour IEnumerable, non? –
Non, sauf si vous utilisez IEnumerable.ElementAt(), car IEnumerable n'offre pas d'accès aléatoire par défaut. Vous ne pouvez pas utiliser foreach car cela modifierait la collection. – Andy
Non, il ne peut fonctionner qu'avec une interface de collection qui vous permet de modifier le contenu de la liste à une position spécifique, ce qui signifie essentiellement IList ou IDictionary. –