现有的类似于 Parallel.For 的 LINQ 扩展方法? [复制]
Posted
技术标签:
【中文标题】现有的类似于 Parallel.For 的 LINQ 扩展方法? [复制]【英文标题】:Existing LINQ extension method similar to Parallel.For? [duplicate] 【发布时间】:2010-09-23 23:46:05 【问题描述】:可能重复:LINQ equivalent of foreach for IEnumerable<T>
ienumerable 的 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++; );
【问题讨论】:
cf Eric Lippert 在这里的回答:blogs.msdn.com/ericlippert/archive/2009/05/18/… 【参考方案1】:解释原因:
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();
【讨论】:
在***.com/questions/858978/…和blogs.msdn.com/b/ericlippert/archive/2009/05/18/…查看确认【参考方案2】:实际上,Microsoft Research 的 Reactive Extensions 框架确实添加了此功能。
在System.Interactive
程序集中,它们包含Run()
和Do()
对IEnumerable<T>
的扩展。
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
【讨论】:
我认为这被低估了。【参考方案3】:List<T>
上的 ForEach 方法执行此操作。您可以将您的集合包装在一个列表中,然后使用该调用,但这并不是一件好事。看来你得自己动手了。
【讨论】:
不,除非我遗漏了什么,否则没有 .ForEach 方法 我调整了我的答案,因为 ForEach 在列表中。【参考方案4】:已经讨论过here 和there。
我太困了,记不住,但基本上,单线程应用程序中的 .ForEach 方法在功能上等同于已经存在的 foreach 语句。据我了解,主要区别在于 ForEach 可以并行化,但这很容易引入不需要的行为。
【讨论】:
以上是关于现有的类似于 Parallel.For 的 LINQ 扩展方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python 的 Sqlalchemy 和 Singlestore sql 创建类似于现有的表
我想使用 P2P 构建一个去中心化的、类似 reddit 的系统。我应该基于啥现有的 p2p 库?