C'est la Liste<T>.Méthode ForEach() disparu?
J'ai commencé à barboter dans Windows 8 metro récemment, et a constaté que l'un de mes vieux copains semble avoir disparu.
J'ai tendance à utiliser le .ForEach()
la méthode que j'ai utiliser le traditionnel foreach()
construire, et j'ai réalisé assez vite que cette méthode n'est pas disponible. Par exemple, ce code ne compile pas sous une appli metro:
var list = new List<string>();
list.ForEach(System.Diagnostics.Debug.WriteLine);
J'ai cherché pour voir si je pouvais trouver toutes les discussions de cela, mais n'a pas pu. Suis-je tout simplement d'être obtus, ou est-il réellement disparu?
- IEnumerable<T> n'a jamais eu un ForEach de la méthode d'extension seulement IList<T> il a
- Vous, monsieur, sont corrects. J'ai été prématurément générique. Je vais changer la question du titre.
- J'ai fait la même erreur - dit le titre IEnumerable mais l'exemple de la tente manifestement d'une liste. Edit: le Titre mise à jour 🙂
- Pourquoi est-ce mieux qu'un
foreach
bloc? - Ils sont les mêmes pour toutes fins pratiques. C'est une question de préférence personnelle; si
List<T>.ForEach
qui pourrait être plus simple à lire pour les one-liners. - mais, sont-one-liners plus simple à lire? Je suppose que le point est discutable.
- Il ne l'est pas, c'est en fait pire (par la mise en œuvre, mais en général, je ne vois pas d'avantage).
- Eh bien, le titre est toujours incorrect (techniquement) parce que ce n'est pas une méthode d'extension. C'est d'un ordinaire de la méthode d'instance sur
List<T>
.
Vous devez vous connecter pour publier un commentaire.
C'est en effet passé:
Très étrangement, cependant, il fait une apparition dans le la documentation, à qui nulle part n'est-il affirmer que cette méthode n'est pas pris en charge dans .NET pour les applications du Windows Store (anciennement .NET pour les applications Metro-style). C'est peut-être juste un oubli sur une partie de l'équipe de documentation.
.ToList()
d'abord, puis itérer que. Rien comme l'itération d'une source, tout en essayant de les transformer afin de ruiner votre journée.À avoir une idée de pourquoi il ne peut plus être compris, lisez ce post, par quelqu'un qui travaille sur l'équipe C# de Microsoft: http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
Fondamentalement, c'est une philosophie. Le "LINQ" caractéristiques sont très inspirée par le paradigme de la programmation fonctionnelle, et le ForEach extension de mouches sur le visage... il encourage les pauvres style fonctionnel.
Une alternative consiste à définir vous-même bien sûr:
De crédit: LINQ équivalent de foreach pour IEnumerable<T>
(Note: pas un doublon)
IEnumerable<T>
etyield return item
après l'exécution de l'action sur l'élément. Cependant, cela va muter les éléments, donc être conscient que ces "effets secondaires" est susceptible d'altérer l'énumération.IEnumerable<T>
afin de permettre la poursuite de l'enchaînement, mais c'est probablement susceptible de rendre les choses plus dangereuses.