A quoi sert List<T>.ForEach ?
Vous êtes vous déjà demandé à quoi servait la méthode ForEach de List<T> ? Personnellement, je me pose cette question depuis assez longtemps : pourquoi l'utiliser alors que la construction foreach du langage fait la même chose, sans appel de delegate.
Nous avons 3 possibilités pour itérer sur une liste :
List<EventArgs> list;
foreach (EventArgs item in list)
{
item.ToString();
}
et
for (int j = 0; j < list.Count; j++)
{
list[j].ToString();
}
sont celles que l'on a l'occasion d'utiliser couramment (surtout la première). Il est assez connu que la première version est beaucoup plus lente que la deuxième (près de 2 fois plus lente). Ceci est du en partie au fait que lors de la compilation d'une construction foreach, le compilateur ajoute un try/catch.
Il y a également une troisième possibilité :
list.ForEach(
delegate(EventArgs item)
{
item.ToString();
});
Il se trouve que cette version est un tout petit peu plus lente que la seconde, mais toujours beaucoup plus rapide que la première, même si celle si utilise un appel de delegate (qui s'avère toujours beaucoup plus lent qu'un appel de méthode classique, non virtuelle).
Je m'appuie sur le bench effectué par Jon Skeet sur son blog : http://msmvps.com/blogs/jon.skeet/archive/2006/01/20/foreachperf.aspx.
Moralité, si vous utilisez List<T>, préférez List<T>.ForEach à la construction foreach du langage.
Cela dit, avec C# 3.0 et surtout LINQ, nous fonçons vers un usage encore plus intensif des foreach et des appels de délégués, mais écrire un bout de code en 1 ligne au lieu de 20 grâce à LINQ vaut surement cette baisse de performance (c'est non seulement plus rapide à écrire, mais surtout plus rapide à relire).
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :