2016-04-16 4 views
1

Я в ситуации, когда мне нужно написать код для печати имени всех месяцев, покрытых за данный интервал. Будет показано 4 способа отображения этого имени интервала.Как отображать названия месяцев в следующей последовательности

(1.) Ежегодно (1) Циклы

(2.) полуежегодно (6 циклов)

(3.) Квартальные (3 циклов)

(4.) в месяц (12 циклы)

Пользователь дает 3 входа, один - дата начала, а другой - цикл. Таким образом, отображение названия месяца должно начинаться с месяца startDate, который пользователь выбирает и должен заканчиваться в том цикле, в который он входит, и третьим входом будет checkBoxSelecionStatus, где он будет вводить «Monthly» (12), «Yearly» (1), «Quarterly» (3), "Пол-Ежегодно" (6). Так что это checkBoxSelecionStatus будет решать индекс пропуска в течение цикла в getMonthByDescription() функции

Теперь то, что должно быть на выходе:

(1) Когда пользователь выбирает «ежемесячно» в checkBoxSelecionStatus и переменная numOfCycles имеет 12 значения и StartDate 3 (по startDate = 3 означает, что он начался с 1 марта до следующих 12 циклов (numOfCycle), который является маршем следующего года). то выход должен составлять все 12 месяцев, которые попадают под этот интервал. так что выход:

Mar 
***** 
Apr 
***** 
May 
***** 
Jun 
***** 
Jul 
***** 
Aug 
***** 
Sep 
***** 
Oct 
***** 
Nov 
***** 
Dec 
***** 
Jan 
***** 
Feb 
***** 

(2) Теперь, когда пользователь выбирает "SemiAnually" в цикле = 12, то она должна отображать

Mar-Aug 
***** 
Sept-Feb 
***** 

(3) Теперь, когда пользователь выбирает «ЕЖЕКВАРТАЛЬНО "в цикле = 12, то она должна отображать:

Mar-May 
***** 
Jun-Aug 
***** 
Sep-Nov 
***** 
Dec-Feb 
***** 

(4) Теперь, когда пользователь выбирает "Год" в 12 цикла, то он должен отображать:

Mar-Feb 
***** 

Пользователь не может вводить int startDate = 3; все время. Он может ввести startDate = 1; (здесь начнется отображение месяца с 1-го месяца, то есть Jan), или он может ввести любой startDate, поэтому код должен работать для всех.

Примечание: Обратите внимание, что желаемая часть не является неправильной в любом случае. В случае ежеквартального я должен иметь 3, потому что 4 квартала «3» в год (это основано на других расчетах моего программного обеспечения), поэтому, когда пользователь выбирает «Квартал», тогда он должен показывать «jan-mar" (if start date is first jan) then apr-jun then jul-sep then oct-dec. Аналогично за полугодие jan-jun then jul-dec

+0

Я думаю, что желаемый результат для '' Quaterly'' неверен. Ежеквартально 4 раза в год, но у вас 7 или 8, в зависимости от того, что последний представляет – Plutonix

+0

Я думаю, что желаемый результат для '' SemiAnually ''тоже неправильный. На мой взгляд, это должны быть только «март» и «сентябрь». Вы должны объяснить, как формируются эти желаемые результаты. –

+0

@thanks all, пожалуйста, ознакомьтесь с примечаниями: часть моего кода, чтобы устранить ваши сомнения. – struggling

ответ

1

Вот ваш адаптированный код. Он просто увеличивает текущий интервал на указанную длину интервала.Ничего особенного:

private static string[] getMonthByDescription(int startMonth, int startYear, int numcycle) 
{ 
    startMonth -= 1; //zero-based index 

    int intervalLength = 0; 
    switch (checkBoxSelecionStatus) 
    { 
     case "Monthly": intervalLength = 1; break; 
     case "Quarterly": intervalLength = 3; break; 
     case "SemiAnually": intervalLength = 6; break; 
     case "Yearly": intervalLength = 12; break; 
    } 
    if (intervalLength == 0) 
     throw new ArgumentException(); 

    int intervals = numcycle/intervalLength; 
    string[] arrOfMonthName = new string[intervals]; 

    for(int i = 0; i < intervals; ++i) 
    { 
     if (intervalLength > 1) 
     { 
      var intervalEnd = startMonth + intervalLength - 1; 
      var intervalEndYear = startYear; 
      if (intervalEnd >= 12) 
      { 
       intervalEnd -= 12; 
       ++intervalEndYear; 
      } 
      arrOfMonthName[i] = monthNames[startMonth] + " " + startYear + " - " + monthNames[intervalEnd] + " " + intervalEndYear; 
     } 
     else 
      arrOfMonthName[i] = monthNames[startMonth] + " " + startYear; 
     startMonth += intervalLength; //go to the next interval 
     if (startMonth >= 12) 
     { 
      startMonth -= 12; 
      ++startYear; 
     } 
    } 

    return arrOfMonthName; 
} 
+0

Быстро и идеально :) Мне было бы очень здорово, если вы сообщите мне, как выглядеть так: mar, 2016-aug2016 then sep, 2016-feb, 2017 (В случае, если startDate равен 3, numCycle = 12 и checkBoxSelecionStatus = "SemiAnually"), я имею в виду год. – struggling

+0

См. Обновление. –

+0

Большое вам спасибо – struggling

1

для тех, кто может предпочесть другой подход, вот мой «Linqified» версия:.

void Main() 
{ 
    int period = 1; 
    DateTime start = new DateTime(2016, 3, 1); 
    var result = Enumerable.Range(0, 12) 
     .Select((i, m) => new { index = i, Month = start.AddMonths(m).ToString("MMMM-yyyy")}) 
     .GroupBy(o => (o.index)/period); 

    foreach (var grp in result) 
    { 
     if (grp.Count() == 1) 
     { 
      Console.WriteLine(grp.First().Month); 
     } 
     else 
     { 
      Console.WriteLine(string.Format("{0} - {1}", grp.First().Month, grp.Last().Month)); 
     } 
     Console.WriteLine("****"); 
    } 

} 

Просто измените переменную period, чтобы отразить, сколько месяцев в период вам нужно специальный случай, когда период = = 1, тогда выход не является диапазоном, но один месяц.

EDIT: Добавлен год

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