2010-04-23 5 views
13

Nous utilisons for ou foreach pour parcourir les collections et traiter chaque entrée.Foreach/For boucle alternative fonction lambda?

Y a-t-il une alternative dans toutes ces nouvelles fonctions lambda pour les collections en C#?

façon traditionnelle de faire

foreach(var v in vs) 
{ 
    Console.write(v); 
} 

Y at-il quelque chose comme?

vs.foreach(v => console.write(v)) 
+0

duplication possible de [équivalent LINQ de foreach pour IEnumerable ] (http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet) – nawfal

Répondre

15

Liste a la méthode ForEach, cependant, IEnumerable ne fonctionne pas.

Il y a un certain nombre de questions/réponses concernant ce sujet. Je pense que la principale raison pour laquelle il n'a pas été implémenté dans IEnumerable est que Linq sur Enumerables est "censé" être sans effets secondaires car c'est un langage d'interrogation.

Eric Lippert explique ses réflexions sur son blog.

http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

+0

+1 pour un lien vers le blog d'Eric Lippert, où il explique pourquoi le faire de cette façon est une mauvaise idée (et traditionnel 'foreach' est en fait meilleur). –

1

Qu'est-ce que vous avez écrit est parfaitement légal (hormis le cas) - en supposant que le type de vs a ForEach défini comme une méthode d'extension ou si elle est un List.

ForEach est défini pour List<T>:

exécute l'action définie sur chaque élément de la List<T>.

8

Oui.

de de IList, il existe une méthode d'extension ForEach:

Il existe une méthode ForEach pour la liste:

List<string> list = new List<string>() { "1", "2", "3", "4" }; 

list.ForEach(s => Console.WriteLine(s)); 

Est-ce que vous cherchez?

+0

Pour être clair: c'est une méthode dans la liste , ce n'est pas une méthode d'extension. Cela n'a pas de sens d'ajouter ForEach à LINQ, mais cela * a * un sens de le déplacer jusqu'à "IList ": Go [ici] (https://connect.microsoft.com/VisualStudio/feedback/details/552410/move-lots-de-utile-méthodes-de-liste-à-ilist-using-extension-méthodes) pour soutenir cela! :) –

+0

Hmm, je suis corrigé. J'ai toujours pensé que c'était une extension de IList plutôt qu'une méthode hors implémentation concrète. –

+0

heheh concernant ** hors de **, j'ai édité votre réponse, mais désolé je ne peux pas éditer votre commentaire, aidez-vous :-) –

0
static void Main(string[] args) 
{ 
    int[] i = {1, 2, 3, 4, 5, 6, 7, 78, 8, 9}; 
    var data = i.ToList(); 

    data.ForEach(m => { Console.WriteLine(m); }); 

    Console.ReadKey(); 
} 
2

Par défaut, il n'y en a pas.
Vous pouvez définir votre propre:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) { 
    foreach(T val in source) 
     action(val); 
} 
0
vs.ToList().ForEach(item => Console.WriteLine(item)); 
0

de .NET 3.5 LINQ n'a pas Foreach, bien que LinqBridge fourni un. Je me suis habitué à utiliser Linqbridge que j'ai naturellement assumed il fait partie de .NET 3.5 Cadre

Il suffit d'ajouter à vos méthodes d'extension des collections si vous pensez qu'il pourrait apporter de la clarté à votre programme

static class Helper 
{ 
    public static IEnumerable<t> ForEeach<t> 
     (this IEnumerable<t> source, Action<t> act) 
    { 
     foreach (T element in source) act(element); 
     return source; 
    } 
} 
2

Eric fait un argument convaincant à l'exception du fait qu'il ya une ForEach pour la Liste < T> mais seulement pour la liste < T>. J'ai eu plusieurs fois l'occasion d'utiliser cette méthode d'extension très utile et j'ai été également frustré par l'absence d'une méthode d'extension générale pour IEnumerable < T>, donc j'ai finalement décidé d'écrire le mien. En faisant cela, j'ai fini par aller plus loin et écrire une fois les méthodes d'extension fluides T> et ForEvery < T> qui permettent de chaayer des actions sur chaque élément et d'exécuter une action juste une fois dans cette chaîne, si pour aucune autre raison, ils semblaient être une bonne idée à ce moment-là.

Voici le code:

public static class EnumerableExtensions 
{ 
    public static void ForEach<T>(this IEnumerable<T> collection, Action<T> action) 
    { 
     foreach (var item in collection) 
     { 
     action(item); 
     } 
    } 

    public static IEnumerable<T> Once<T>(this IEnumerable<T> collection, 
     Func<IEnumerable<T>, bool> predicate, Action<IEnumerable<T>> action) 
    { 
     if (predicate(collection)) 
     action(collection); 
     return collection; 
    } 

    public static IEnumerable<T> ForEvery<T>(this IEnumerable<T> collection, 
     Func<T, bool> predicate, Action<T> action) 
    { 
     foreach (var item in collection) 
     { 
     if (predicate(item)) 
      action(item); 
     } 
     return collection; 
    } 
} 

Vous pouvez trouver le code d'utilisation exemple sur mon blog Extend IEnumerable with ForEach and Once Methods.

Questions connexes