关于c#:现有的LINQ扩展方法类似于Parallel.For?

Existing LINQ extension method similar to Parallel.For?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
LINQ equivalent of foreach for IEnumerable

IEnumerable的LINQ扩展方法非常方便…但是,如果您只想对枚举中的每个项应用一些计算而不返回任何内容,则没有那么有用。所以我想知道我是否只是缺少了正确的方法,或者它是否真的不存在,因为如果有内置版本的话,我宁愿使用它…但我没有找到一个:(-)

我可以发誓在某个地方有一个.foreach方法,但我还没有找到它。同时,我也写了自己的版本,以防它对其他人有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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(delegate(MyClass item) { item.Count++; });


更清楚地说明原因:

LINQ在本质上是功能性的。用于查询数据并返回结果。LINQ查询不应该改变应用程序的状态(除了一些例外,如缓存)。因为foreach不返回任何结果,所以除了传递给它的内容之外,它没有很多不涉及改变某个内容状态的用途。如果您需要foreach()扩展方法,那么可以很容易地滚动您自己的方法。

另一方面,如果您希望接收输入并对返回结果的每个项调用函数,那么Linq提供了一种通过其Select方法的方法。

例如,以下代码对列表中的每个项调用函数委托,如果该项为正数,则返回true:

1
2
3
4
5
6
7
8
9
10
11
12
    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();        
    }


实际上,微软研究院的反应式扩展框架确实添加了这个功能。在System.Interactive组件中,它们包括了Run()Do()IEnumerable的扩展。

do(action)将对每个元素执行该操作并返回。这对于向LINQ查询添加日志记录很有用,例如:

1
2
3
4
5
6
7
8
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));

这将导致:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

运行(操作)类似于foreach循环,这意味着它折叠执行操作的序列。

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

RX框架可在以下位置找到:http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx


EDOCX1的0的方法是这样做的。您可以将您的集合包装在列表中,然后使用该调用,但这确实不是一件好事。看来你得自己滚了。


已经讨论过了。

我太困了,记不起来了,但基本上,单线程应用程序中的.foreach方法在功能上相当于已经存在的foreach语句。从我的理解来看,主要的区别在于前臂可以被平行化,但这太容易引入不需要的行为。