Search code examples
c#.netvb.netextension-methods

Why is there no ForEach extension method on IEnumerable?


Inspired by another question asking about the missing Zip function:

Why is there no ForEach extension method on the IEnumerable interface? Or anywhere? The only class that gets a ForEach method is List<>. Is there a reason why it's missing, maybe performance?


Solution

  • There is already a foreach statement included in the language that does the job most of the time.

    I'd hate to see the following:

    list.ForEach( item =>
    {
        item.DoSomething();
    } );
    

    Instead of:

    foreach(Item item in list)
    {
         item.DoSomething();
    }
    

    The latter is clearer and easier to read in most situations, although maybe a bit longer to type.

    However, I must admit I changed my stance on that issue; a ForEach() extension method would indeed be useful in some situations.

    Here are the major differences between the statement and the method:

    • Type checking: foreach is done at runtime, ForEach() is at compile time (Big Plus!)
    • The syntax to call a delegate is indeed much simpler: objects.ForEach(DoSomething);
    • ForEach() could be chained: although evilness/usefulness of such a feature is open to discussion.

    Those are all great points made by many people here and I can see why people are missing the function. I wouldn't mind Microsoft adding a standard ForEach method in the next framework iteration.