2010-06-22 105 views
2

对于一维数组,我可以使用sum方法来获取所有值的总和。多维数组(C#)中值的快速求和

int[] array = {6,3,1}; 
Console.WriteLine(array.Sum()); 

对于多维数组(3D在我的情况),这是不能做到的。很明显,我可以对它进行全面的讨论,但这看起来很冗长,我怀疑它会表现糟糕。

有没有办法将阵列弄平?或者只是为了得到我没有看到的总和?

+0

你在使用VS/DOTNET的版本,你可以使用LINQ? – 2010-06-22 12:03:34

+1

@precq时代数组中的@Duke Duddridge没有做数据 – Andrey 2010-06-22 12:09:30

回答

8

总和确实是foreach。他们背后没有魔法。如果你是这么表现饥饿使用for而不是foreach。您也可以并行执行此操作,此操作可以很容易并行化。

+0

+1,好点,并行化如果你可以@Tom Wright – 2010-06-22 12:10:04

+1

也许这应该是一个单独的问题,但我该如何并行化呢? (对C#很新...) – 2010-06-22 12:12:52

+0

看看这两个链接: http://msdn.microsoft.com/en-us/magazine/cc163329.aspx http://blogs.msdn.com/b/pfxteam/ 特别是在博客上,你可以下载一堆样本(ParallelExtensionsExtras) – 2010-06-22 12:19:14

2

为什么foreach表现不好?您必须至少读取一次每个值才能计算总和。这是没有办法的(当然假设是“随机”值)。所以也许有更美丽的方式,但不是一个更高性能的方式(根据Big O)。

+1

'for'便宜一点。 – Andrey 2010-06-22 12:08:54

+0

我不确定,但根据我看到的一些微观基准,它们之间可能存在性能差异。 – 2010-06-22 12:09:23

+0

@Andrey,bassfriend:你是对的,也许你会得到更多的高性能实现,但是他们都依赖于循环每一个值。微引导和平行化可能会有所帮助,但我的观点是,具有* foreach/for *的算法本身没有不好的性能。 Linq或者什么都不能跳过循环所有值的步骤。 – tanascius 2010-06-22 12:13:05

2

如果你有锯齿状排列,想干净的代码,你可以使用

int[][] array = { new []{ 6, 3, 1 }, new []{ 6, 3, 1 } }; 
Console.WriteLine(array.Sum(i => i.Sum())); 
4

这会做的伎俩。

var i = array.SelectMany(j => j).Sum() 

,你可以在.NET 4并行这种类似这样的

var i = array.AsParallel().SelectMany(k => k).Sum(); 
+0

没有对它进行基准测试,但我认为array.Sum(j => j。 Sum())应该更快,而且绝不可读。的SelectMany()。Sum()必须在数组(AFAIK)中移动两次,一次生成新的枚举并再次计算总和(除非LINQ优化了这个,不确定)。 – dbemerlin 2010-06-22 13:03:20

+0

总和需要和ienum,所以它会长期保持运行总量和循环低谷。所以对于每个int selectmany提交它将会将其添加到总数中,因此它只会遍历所有内容。但我还没有看过它。 – albertjan 2010-06-22 14:11:17