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

可能重复:
LINQ相当于foren for IEnumerable

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

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

using System.Collections; using System.Collections.Generic; public delegate void Function(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(this IEnumerable enumerable, Function func) { foreach (T item in enumerable) { func(item); } } } 

用法是:

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

更多地了解原因:

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

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

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

  static void Main(string[] args) { IEnumerable list = new List() { -5, 3, -2, 1, 2, -7 }; IEnumerable isPositiveList = list.Select(i => i > 0); foreach (bool isPositive in isPositiveList) { Console.WriteLine(isPositive); } Console.ReadKey(); } 

实际上,Microsoft Research的Reactive Extensions框架确实添加了此function。 在System.Interactive程序System.Interactive它们包含了对IEnumerableRun()Do()扩展。

Do(action)将对每个元素执行操作并将其返回。 这对于将记录添加到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上的ForEach方法执行此操作。 您可以将您的集合包装在一个列表中然后使用该调用,但这并不是一件好事。 看起来你必须自己动手。

已经在这里和那里讨论过。

我太困倦了,但基本上,单个线程应用程序中的.ForEach方法在function上等同于已经存在的foreach语句。 根据我的理解,主要区别在于ForEach可以平行,但这会很容易引入不需要的行为。