C#: Toute prestation de Liste<T>.ForEach(...) sur la plaine de boucle foreach?
Je me demandais pourquoi List<T>.ForEach(Action<T>)
existe.
Est-il un avantage ou la différence en faisant :
elements.ForEach(delegate(Element element){ element.DoSomething(); });
sur
foreach(Element element in elements) { element.DoSomething();}
?
Vous devez vous connecter pour publier un commentaire.
Une différence essentielle est avec la .ForEach méthode, vous pouvez modifier la collection sous-jacente. Avec la syntaxe foreach vous aurez une exception si vous faites cela. Voici un exemple (pas exactement le meilleur, mais il fonctionne):
ForEach(Action<T>)
utilise une boucle for. Dans le Réflecteur, il ressemble à ceci:for (int i = 0; i < this._size; i++) { action(this._items[i]); }
je pense que vous avez encore du potentiel pour des résultats irréguliers, mais, si vous effectuez quelque chose comme Insérer un élément à l'avance de votre position actuelle (par exemple, à la position 0) alors que vous êtes en boucle.List<T>
méthodes avec un paramètre appelé "match". Si vous passez null l'Action<T>
, je vais vous dire le "match" paramètre est null plutôt que le bon paramètre "action".)C'est très probablement à être plus rapide (vous ne devriez pas choisir entre l'un ou l'autre simplement en raison de la faible performance des prestations, sauf si vous avez affaire à des calculs lourds calculs ou graphiques de l'application et vous avez besoin pour obtenir les la plupart hors de cycles du processeur) et vous pouvez passer des délégués directement à ce qui peut être pratique dans certains cas:
ints
qui doivent être "unboxed" lors de l'utilisation d'une liste de tableaux, tandis que la version générique n'a pas besoin de ça.ForEach
méthode. Les tests sont en comparantList<T>.ForEach
etforeach
dansList<T>
et de même pour les tableaux.List<T>.ForEach
parce que c'est plus rapide" ici?Il est un moyen plus pratique/abréviation pour exécuter une action sur les éléments de la liste, MoreLinq étend cette fonctionnalité pour tous qui implémentent l'interface IEnumerable.