Possible Duplicate:
Why is there not a ForEach extension method on the IEnumerable interface?
EDIT
For reference, here's the blog post which eric referred to in the comments
https://ericlippert.com/2009/05/18/foreach-vs-foreach/
ORIG
More of a curiosity I suppose but one for the C# Specification Savants...
Why is it that the ForEach() clause doesn't work (or isn't available) for use on IQueryable/IEnumerable result sets...
You have to first convert your results ToList() or ToArray() Presumably theres a technical limitation to the way C# iterates IEnumerables Vs. Lists... Is it something to do with the Deferred Execution's of IEnumerables/IQuerable Collections. e.g.
var userAgentStrings = uasdc.UserAgentStrings
.Where<UserAgentString>(p => p.DeviceID == 0 &&
!p.UserAgentString1.Contains("msie"));
//WORKS
userAgentStrings.ToList().ForEach(uas => ProcessUserAgentString(uas));
//WORKS
Array.ForEach(userAgentStrings.ToArray(), uas => ProcessUserAgentString(uas));
//Doesn't WORK
userAgentStrings.ForEach(uas => ProcessUserAgentString(uas));
It's perfectly possible to write a ForEach
extension method for IEnumerable<T>
.
I'm not really sure why it isn't included as a built-in extension method:
ForEach
already existed on List<T>
and Array
prior to LINQ.foreach
loop to iterate the sequence.yield
s each item after performing an action, but that behaviour isn't particularly intuitive.)public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
if (source == null) throw new ArgumentNullException("source");
if (action == null) throw new ArgumentNullException("action");
foreach (T item in source)
{
action(item);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With