假设我们有这样一个数组:
var arr = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
我想执行聚合:
var sum = arr.Aggregate((a, b) => a + b);
当然,这只是简化它的一个例子.我没有处理int
,但需要合并的更复杂的对象(它们是树).但是,这种聚合效果非常糟糕,因为它从左向右迭代,添加了两个相互对立的元素.在int的情况下,这没有任何区别,但是在复杂对象的情况下,更好的解决方案是以树的方式执行聚合.这是什么意思?
55 36 19 10 26 19 3 7 11 15 19 1 2 3 4 5 6 7 8 9 10
我希望这个架构能够说清楚.
如何在C#的LINQ中实现这一目标?
您可以使用PLINQ(并行LINQ).
Parallel Aggregation模式使用在计算结束时合并的非共享局部变量来给出最终结果.对于部分的,局部计算的结果,使用非共享局部变量是循环的步骤如何彼此独立.
如果调用AsParallel
扩展方法,则指示编译器绑定到PLINQ而不是LINQ.该程序将使用表达式中所有进一步查询操作的并行版本.
在您的情况下,代码将是:
var sum = arr.AsParallel().Aggregate((a, b) => a + b);
在这里您可以找到更多信息:https://msdn.microsoft.com/en-us/library/ff963547.aspx