现有的LINQ扩展方法类似于Parallel.For?

可能重复:
IEnumerable <T>的foreach相当于LINQ

可枚举的linq扩展方法非常方便,但如果您只想对枚举中的每个项目应用一些计算而不返回任何内容,那么这种方法就没有用处。 所以我想知道如果也许我只是错过了正确的方法,或者如果它真的不存在,我宁愿使用内置版本,如果它可用...但我还没有找到一个:-)

我可以发誓在那里有一个.ForEach方法,但我还没有找到它。 与此同时,我写了自己的版本,以防其他人使用它:

using System.Collections;
using System.Collections.Generic;

public delegate void Function<T>(T item);
public delegate void Function(object item);

public static class EnumerableExtensions
{
    public static void For(this IEnumerable enumerable, Function func)
    {
        foreach (object item in enumerable)
        {
            func(item);
        }
    }

    public static void For<T>(this IEnumerable<T> enumerable, Function<T> func)
    {
        foreach (T item in enumerable)
        {
            func(item);
        }
    }
}

用法是:

myEnumerable.For<MyClass>(delegate(MyClass item) { item.Count++; });


为什么要放弃更多一点:

LINQ本质上是功能性的。 它用于查询数据并返回结果。 LINQ查询不应该改变应用程序的状态(有一些例外,如缓存)。 因为foreach不会返回任何结果,所以它没有太多的用处,除了传递给它的东西外,不涉及改变某些东西的状态。 如果你需要一个Foreach()扩展方法,很容易推出自己的。

另一方面,如果你想要输入并在每个返回结果的项目上调用一个函数,LINQ将通过它的select方法提供一种方法。

例如,下面的代码为列表中的每个项目调用一个函数委托,如果该项目是肯定的,则返回true。

    static void Main(string[] args)
    {
        IEnumerable<int> list = new List<int>() { -5, 3, -2, 1, 2, -7 };
        IEnumerable<bool> isPositiveList = list.Select<int, bool>(i => i > 0);

        foreach (bool isPositive in isPositiveList)
        {
            Console.WriteLine(isPositive);
        }

        Console.ReadKey();        
    }

实际上,Microsoft Research的Reactive Extensions框架确实增加了这个功能。 在System.Interactive程序System.Interactive它们包含一个Run()和一个Do()IEnumerable<T>扩展。

Do(动作)将对每个元素执行动作并使其恢复。 这对于将日志记录添加到linq查询很有用,例如:

var res = GetRandomNumbers(100).Take(10)
      .Do(x => Console.WriteLine("Source  -> {0}", x))
      .Where(x => x % 2 == 0)
      .Do(x => Console.WriteLine("Where   -> {0}", x))
      .OrderBy(x => x)
      .Do(x => Console.WriteLine("OrderBy -> {0}", x))
      .Select(x => x + 1)
      .Do(x => Console.WriteLine("Select  -> {0}", x));

这将导致:

Source  -> 96 
Where   -> 96 
Source  -> 25 
Source  -> 8 
Where   -> 8 
Source  -> 79 
Source  -> 25 
Source  -> 3 
Source  -> 36 
Where   -> 36 
Source  -> 51 
Source  -> 53 
Source  -> 81 
OrderBy -> 8 
Select  -> 9 
9 
OrderBy -> 36 
Select  -> 37 
37 
OrderBy -> 96 
Select  -> 97 
97

Run(action)就像一个foreach循环,意思是它折叠执行动作的顺序。

你可以在这里阅读更多关于它的信息:http://community.bartdesmet.net/blogs/bart/archive/2009/12/26/more-linq-with-system-interactive-the-ultimate-imperative.aspx

Rx框架可以在这里找到:http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx


List<T>上的ForEach方法执行此操作。 你可以将你的集合包装在一个列表中,然后使用这个调用,但这不是一件好事。 看起来你必须推出自己的。

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

上一篇: Existing LINQ extension method similar to Parallel.For?

下一篇: Lambda Expression using Foreach Clause