Apply function to all elements of collection through LINQ

This question already has an answer here:

  • LINQ equivalent of foreach for IEnumerable<T> 21 answers

  • A common way to approach this is to add your own ForEach generic method on IEnumerable<T> . Here's the one we've got in MoreLINQ:

    public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
    {
        source.ThrowIfNull("source");
        action.ThrowIfNull("action");
        foreach (T element in source)
        {
            action(element);
        }
    }
    

    (Where ThrowIfNull is an extension method on any reference type, which does the obvious thing.)

    It'll be interesting to see if this is part of .NET 4.0. It goes against the functional style of LINQ, but there's no doubt that a lot of people find it useful.

    Once you've got that, you can write things like:

    people.Where(person => person.Age < 21)
          .ForEach(person => person.EjectFromBar());
    

    The idiomatic way to do this with LINQ is to process the collection and return a new collection mapped in the fashion you want. For example, to add a constant to every element, you'd want something like

    var newNumbers = oldNumbers.Select(i => i + 8);
    

    Doing this in a functional way instead of mutating the state of your existing collection frequently helps you separate distinct operations in a way that's both easier to read and easier for the compiler to reason about.

    If you're in a situation where you actually want to apply an action to every element of a collection (an action with side effects that are unrelated to the actual contents of the collection) that's not really what LINQ is best suited for, although you could fake it with Select (or write your own IEnumerable extension method, as many people have.) It's probably best to stick with a foreach loop in that case.


    You could also consider going parallel, especially if you don't care about the sequence and more about getting something done for each item:

    SomeIEnumerable<T>.AsParallel().ForAll( Action<T> / Delegate / Lambda )
    

    For example:

    var numbers = new[] { 1, 2, 3, 4, 5 };
    numbers.AsParallel().ForAll( Console.WriteLine );
    

    HTH.

    链接地址: http://www.djcxy.com/p/52994.html

    上一篇: 为泛型c#集合中的每个值调用一个函数

    下一篇: 通过LINQ将函数应用于所有集合元素