2016-07-13 1 views
0

Как это делается здесь: C# Two-dimensional int array,Sum off all elements, но на этот раз с зубчатыми массивами. Получение:Суммирование массива зубчатых массивов в C#

Исправление System.IndexOutOfRangeException.

Я начинаю просить о помощи. Это мой код:

public static int Sum(int[][] arr) 
{ 
    int total = 0; 
    for (int i = 0; i < arr.GetLength(0); i++) 
    { 
     for (int j = 0; j < arr.GetLength(1); j++) 
     { 
       total += arr[i][j]; 
     } 
    } 
    return total; 
} 

static void Main(string[] args) 
{ 
    int[][] arr = new int[][] 
    { 
      new int [] {1}, 
      new int [] {1,3,-5}, 
    }; 
    int total = Sum(arr); 
    Console.WriteLine(); 
    Console.ReadKey();  
} 
+2

Пожалуйста, отформатируйте свой код с помощью правил конвенции. Например, используйте Ctrk + K + D в Visual Studio. Очень неприятно читать ваш код). Подробнее: https://msdn.microsoft.com/en-us/library/ff926074.aspx –

+0

@ GiladGreen - Спасибо за ваш ответ. Работает программа. Но вывод показывает пустое пространство. – Shopska

+0

@Shopska - вам нужно добавить всего на 'WriteLine' –

ответ

2

В вашем внутреннем цикле сделать это вместо того, чтобы:

for (int i = 0; i < arr.Length; i++) 
{ 
    if (arr[i] != null) 
    { 
     for (int j = 0; j < arr[i].Length; j++) 
     { 
      total += arr[i][j]; 
     } 
    } 
} 
return total; 

Потому что ваши списки даже не вы получите исключение на arr.GetLength(1) для первого измерения - это не имеет никакого пункта в то место.

if (arr[i] != null) линия необходима в том случае, массив будет выглядеть примерно так:.

int[][] arr = new int[][] 
{ 
     new int [] {1}, 
     null, 
     new int [] {1,3,-5}, 
}; 

В этом случае, когда мы делаем цикл с i==1 и попытаться сделать arr[i].Length (то есть arr[1].Length мы Получать NullReferenceException


и после того, как вы делаете основы и получить Linq все текущий Sum метод может быть заменен:

arr.SelectMany(item => item).Sum() 

Но это хорошо, чтобы начать с основами :)

+1

'SelectMany' умный. Без него можно было бы сделать 'arr.Sum (item => item.Sum())'. Ни одно из ваших решений не будет работать в случае, когда некоторые из «внутренних» массивов «нуль». –

+1

исправлено дело «null» –

+0

@Shopska - Добавлено объяснение о 'null'. –

2

Поскольку вы используете зазубренный массив размеры этого массива не обязательно даже. Взгляните на код инициализации этого зубчатым массива:

int[][] arr = new int[][] { 
    new int [] {1}, 
    new int [] {1,3,-5}, 
}; 

Таким образом, в первом измерении, есть два элемента ({1} и {1, 3, -5}). Но второе измерение не имеет такой же длины. Первый элемент имеет только один элемент ({1}), тогда как у второго элемента есть 3 элемента ({1, 3, -5}). Вот почему вы столкнулись с IndexOutOfRangeException.

Чтобы исправить это, вам необходимо настроить внутренний цикл на количество элементов для этого измерения. Вы можете сделать это вот так:

for (int i = 0; i < arr.Length; i++) { 
    for (int j = 0; j < arr[i].Length; j++) { 
     total += arr[i][j]; 
    } 
} 
+0

Спасибо за ваш ответ, но этот метод не работает. – Shopska

+0

Можете ли вы сказать, что именно не сработало? Когда я запускаю код, он работает.Хотя вы должны дополнительно следить за 'NULL' как @Gilad отметил уже. – khlr

+0

извините, его ошибка, которую «Гилад Грин» объяснил ей :) – Shopska