9 votes

Pourquoi la méthode ForEach ne s'applique-t-elle qu'aux listes ?

De ce que je peux voir, le ForEach n'est disponible que pour la méthode List classe .

Pourquoi ça ? Je ne vois aucune raison pour ForEach ne doit pas être disponible pour toute classe implémentant le IEnumerable / IEnumerator et c'est une méthode très utile si vous devez effectuer une petite action (1 ligne est plus lisible que 1 ligne + 2 syntaxes foreach passe-partout...).

Mise à jour : Je vais clarifier ma question. Il y a des raisons parfaitement valables pour inclure ForEach dans les séquences. Il existe de très bonnes raisons pour no y compris ForEach dans toutes les séquences.

Mais je ne comprends pas pourquoi ForEach être inclus dans certaines séquences seulement.

23voto

Ahmad Mageed Points 44495

Voir le billet d'Eric Lippert : "foreach" vs "ForEach"

A il n'y a pas de "d'extension de l'opérateur de séquence "ForEach fournie par Microsoft. La classe List dispose déjà d'une telle méthode, mais il n'y a aucune raison mais il n'y a aucune raison pour qu'une telle méthode ne soit pas créée en tant que méthode d'extension pour la classe List. pas être créée comme méthode d'extension pour toutes les séquences.

...

Mais nous pouvons aller un peu plus loin. Je suis philosophiquement opposé à la fourniture d'une une telle méthode, pour deux raisons.

...

T viole le principe de la programmation fonctionnelle fonctionnels sur lesquels sont basés tous les autres sont basés. Il est clair que le l'unique but d'un appel à cette méthode est de provoquer des effets de bord.

...

T n'ajoute aucun nouveau pouvoir de représentation à la langue.

...

W h Liste. Personnellement, je trouve que la méthode méthode "ForEach" sur List philosophiquement troublante pour toutes les raisons que je trouverais une méthode d'extension sur IEnumerable. sur IEnumerable est troublante. (Et l'équipe VSL contrôle cela). La seule circonstance atténuante est que List est clairement conçu pour être clairement conçue pour être mutable, une structure de données mutable, non exempte d'effets de bord, donc l'utilisation d'expressions qui la mutent semble un peu moins mauvais. -- Eric

7voto

Mattias Jakobsson Points 6101

Vous avez raison, la méthode est définie dans la classe List. Cependant, il est assez facile de créer une méthode d'extension qui fait la même chose.

public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
{
    foreach (var t in enumerable)
        action(t);
}

2voto

madatanic Points 849

Correct. Cependant, si vous voulez utiliser l'avantage de la boucle ForEach, il existe une méthode appelée "ToList", comme indiqué ci-dessous, qui permet de convertir un tableau en liste.

String[] array = new String[3];
List<String> list = array.ToList<String>();

2voto

Dave Van den Eynde Points 8199

Techniquement, avec .NET 3.5, vous pourriez faire ceci : (vous devez inclure System.Linq)

IEnumerable<string> a = ...

a.All(i => { DoSomethingWith(i); return true; });

0voto

Matthew Whited Points 12255

Voici une version différente de la méthode d'extension ForEach() qui prend en charge la gestion des exceptions. Cette méthode attrape toutes les exceptions, vous pouvez donc relancer celles que vous ne traitez pas.

(Ceci a été écrit pour VS 2010... si vous utilisez une version antérieure, vous devrez probablement supprimer l'option \= null de la signature de la méthode)

public static void SafeForEach<T>(this IEnumerable<T> input,
                                       Action<T> action,
                                       Action<T, Exception> faultAction = null)
{
    if (input == null || action == null)
        return;
    foreach (var item in input)
        try
        {
            action(item);
        }
        catch (Exception ex)
        {
            if (faultAction == null)
                Debug.WriteLine(ex);
            else
                faultAction(item, ex);
        }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X