通过LINQ将函数应用于所有集合元素

这个问题在这里已经有了答案:

  • LINQ相当于foreach for IEnumerable <T> 21个答案

  • 解决这个问题的常用方法是在IEnumerable<T>上添加自己的ForEach泛型方法。 这是我们在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);
        }
    }
    

    (其中ThrowIfNull是任何引用类型的扩展方法,这是显而易见的事情。)

    看看这是否是.NET 4.0的一部分将会很有趣。 它违背了LINQ的功能风格,但毫无疑问,很多人认为它很有用。

    一旦你有了,你可以写下如下的东西:

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

    用LINQ做这件事的惯用方法是处理集合并返回一个以你想要的方式映射的新集合。 例如,要为每个元素添加一个常量,您需要类似的东西

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

    以一种功能性的方式来做这件事,而不是经常改变现有集合的状态,这有助于你以一种易于阅读和易于编译器推理的方式区分不同的操作。

    如果您处于某种情况下,您实际上想要将操作应用于集合中的每个元素(具有与集合的实际内容无关的副作用的操作),但这并非LINQ最适合的操作,尽管您可以用Select来伪造它(或者像许多人一样编写自己的IEnumerable扩展方法)。在这种情况下,最好使用foreach循环。


    你也可以考虑平行进行,特别是如果你不关心序列,更多的是为每个项目完成一些事情:

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

    例如:

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

    HTH。

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

    上一篇: Apply function to all elements of collection through LINQ

    下一篇: Linq style "For Each"