2010-06-22 3 views
2

С 1D-массивом я могу использовать метод sum для получения суммы всех значений.Быстрая сумма значений в многомерном массиве (C#)

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

С многомерным массивом (3D в моем случае) это невозможно. Очевидно, я мог бы пойти на все это, но это кажется многословным, и я подозреваю, что он будет действовать плохо.

Есть ли способ сгладить массив? Или хороший способ просто получить сумму, которую я не видел?

+0

Какую версию VS/Dotnet вы используете, Вы можете использовать Linq? –

+1

@ Luke Duddridge в массивах долинских эпох не делал сумм – Andrey

ответ

8

Сумма составляет точно foreach. За ними нет волшебства. Если вы так голодны, используйте for вместо foreach. Вы можете сделать это параллельно, эту операцию можно легко распараллелить.

+0

+1, хорошая точка, распараллеливать, если вы можете @Tom Wright –

+1

Возможно, это должен быть отдельный вопрос, но как бы я его распараллеливал? (Очень новый для C# ...) –

+0

Проверьте эти две ссылки: http://msdn.microsoft.com/en-us/magazine/cc163329.aspx http://blogs.msdn.com/b/pfxteam/ Специально в блоге вы можете скачать кучу образцов (ParallelExtensionsExtras) –

2

Зачем нужно делать foreach? Вы должны прочитать каждое значение хотя бы один раз, чтобы рассчитать сумму. Нет никакого способа обойти это (предполагая «случайные» значения, конечно). Так что, может быть, есть более красивый способ, но не более эффективный (говорящий в терминах Big O).

+1

'for' немного дешевле. – Andrey

+0

Я не уверен, но в соответствии с некоторыми микрообъектами, которые я видел, между ними могут быть отличительные отличия. –

+0

@ Андрей, bassfriend: вы правы, может быть, вы получите больше реалистичных реализаций, но все они полагаются на цикл по каждому отдельному значению. Возможно, поможет и Microbenchmarking, и распараллеливание, но я считаю, что алгоритм с * foreach/for * не имеет плохой производительности как таковой. Linq или то, что когда-либо не может пропустить шаг цикла по всем значениям. – tanascius

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. Сумма()) должна быть более быстрой и никоим образом не читаемой. SelectMany().Сумма() должна перемещаться дважды через массив (AFAIK), один раз для генерации нового перечисляемого и снова для вычисления суммы (если LINQ не оптимизирует это, не уверен в этом). – dbemerlin

+0

сумма берет и ienum, поэтому она будет продолжать поддерживать общий итог и прокладывать его через него. поэтому для каждого набора selectmany он добавит его к сумме, так что он будет проходить только через один раз. Но я тоже не рассматривал это. – albertjan

Смежные вопросы