Eric presenta un argumento convincente excepto por el hecho de que hay una ParaCada para la Lista < T> pero solo para la lista < T>. He cometido numerosas ocasiones para usar ese método de extensión muy útil y me ha frustrado igualmente la falta de un método de extensión general para IEnumerable < T>, así que finalmente decidí escribir el mío.
De este modo, terminé yendo un paso más allá y escribir una vez < T> y forevery < T> métodos de extensión fluidas que permiten chaing de acciones sobre cada elemento y la ejecución de una acción sólo una vez en esa cadena, si no por otra razón que parecían una buena idea en ese momento.
Aquí está el código:
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;
}
}
Puede encontrar el código ejemplo de uso en mi blog Extend IEnumerable with ForEach and Once Methods.
posible duplicado de [LINQ equivalente de foreach para IEnumerable] (http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet) –
nawfal