2015-08-14 2 views
1

Я сделал цикл, который в течение каждого месяца с текущего возраста через год х, скажем 80.Изменение размера массива потерять пустые значения

У меня есть массив yearCalculation лет и каждый yearCalculation содержит среди прочего массив monthCalculation. (Только в случае, если кто-то хочет, чтобы бросить комментарий о списках, я в настоящее время с помощью массивов и хочу увидеть, если есть простое решение.)

Это выглядит следующим образом:

yearCalculations[] years = years.InstantiateArray(//Number of years, [80 minus age]//); 
monthCalculations[] months = months.InstantiateArray(//Number of months in a year, [this should be 12]//); 

После того, как Я повторяю все периоды и заполняю их различными вычислениями. (Однако, после того, как возраст х было достигнуто, все расчеты приведут к нулевому):

for (int i = 0; i < yearCalculations.Length; i++) { 
    for (int j = 0; j < yearCalculations[i].monthCalculations.Length; j++) { 
     Double age = calculateAge(birthDate, dateAtTimeX); 
     if(age < ageX){ 
      //Do all sorts of calculations. 
     }else{ 
      //Break out of the loops 
     } 
    } 
} 

Как вы можете понять, в возрасте X (80), расчеты будет полным, но последний yearcalculation будет содержать некоторые результаты, без расчетов. Допустим, это с 7-го месяца. Самый простой способ изменить размер этого массива, удалив все месяцы без вычислений (например, индекс 6 и дальше)?


Только для полноты, вот функция instantiateArray;

public static T[] InstantiateArray<T>(this T[] t, Int64 periods) where T : new() 
{ 
    t = new T[periods]; 
    for (int i = 0; i < t.Length; i++){ 
     t[i] = new T(); 
    } 
    return t; 
} 
+4

Серьезно, почему бы вам не использовать 'List ' для этого? Существует не так много причин использовать массивы, особенно когда вам нужно изменить их размер. – xxbbcc

+0

@JonSkeet Что так ужасно относительно метода расширения? Он работает для этой цели. – Sliver2009

+0

@ Sliver2009: он не использует существующее значение вообще - вы предположительно используете его только для ввода типа ... Я не рассматриваю это как хорошее использование для метода расширения лично. (Я удивлен, что он даже работает в коде, с которым вы его используете, - вы объявляете переменную и используете ее в своем собственном инициализаторе, который не должен компилироваться.) –

ответ

7

Чтобы удалить пустые значения из массива можно использовать LINQ

var arr = years.Where(x => !string.IsNullOrEmpty(x)).ToArray();//or what ever you need 
+0

Очень приятно, я использую LINQ все время. Я просто не знал о том, что я могу использовать его на массивах. (Теперь вы упомянули об этом, я чувствую себя очень глупо!) – Sliver2009

+0

@ Sliver2009 allright haha. – Slashy

+1

FYI работает на все, что реализует 'IEnumerable ' –

1

Метод Array.Resize должен сделать трюк с новой общей длиной. Вы знаете, общая новая длина будет общая старая длина - (12 - месяц как междунар в год)

2

Вы не можете измените размер массива.

To quote MSDN:

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

Какие методы, подобные Array.Resize, действительно представляют собой выделение нового массива и копирование элементов. Это важно понять. Вы не изменяете размер массива, а перераспределяете его.

До тех пор, пока вы используете массивы, в конце ответ будет сводиться к тому, чтобы «выделить новый массив, а затем скопировать то, что вы хотите сохранить».

+0

Я знаю, что не могу «буквально» изменять размер массива. Но это показатель речи, я полностью осознаю, что он создает другой экземпляр. – Sliver2009

+1

Ах, извините, тогда. Но, пожалуйста, избегайте использования термина «изменить размер» в будущем, если это не то, что вы на самом деле имеете в виду. – Reikim