2016-04-16 13 views
1

Ich bin in einer Situation, dass ich einen Code schreiben muss, um den Namen aller Monate zu drucken, die in dem angegebenen Intervall abgedeckt werden. Es gibt 4 Möglichkeiten, den Namen des Intervalls anzuzeigen.So zeigen Sie Monatsnamen in der folgenden Reihenfolge an

(1.) jährlich (1 Zyklen)

(2.) halbjährlich (6 Zyklen)

(3.) Quarterly (3 Zyklen)

(4.) Monthly (12 Zyklen)

Der Benutzer gibt 3 Eingänge, einer ist Startdatum und ein anderer ist Zyklus. Daher muss die Monatsname-Anzeige vom startDate-Monat beginnen, den der Benutzer auswählt, und muss am Zyklus enden, den er eingibt, und die dritte Eingabe wird checkBoxSelecionStatus sein, wo er "Monthly" (12), "Yearly" (1), "Quarterly" eingeben wird. (3), "halbjährlich" (6). Also das checkBoxSelecionStatus der entscheiden Index-skip in for-Schleife in getMonthByDescription() Funktion

Nun, was die Ausgabe sein muss:

(1) Wenn der Benutzer wählt "Monthly" in checkBoxSelecionStatus und numOfCycles Variable hat 12 Wert und startdate ist 3 (von startDate = 3 bedeutet, dass es vom 1. März bis zu den nächsten 12 Zyklen (numOfCycle) begonnen hat, was März des nächsten Jahres ist). dann sollte die Ausgabe alle 12 Monate sein, die in diesem Intervall liegen. so ist es Ausgabe ist:

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

(2) nun, wenn der Benutzer "SemiAnually" in Zyklus auswählt = 12, dann muss es das Display

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

(3) Wenn nun der Benutzer „Quaterly "in Zyklus = 12, dann muss es zeigen:

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

(4) wenn nun der Benutzer "" jährlich in 12-Zyklus, dann muss es zeigen:

Mar-Feb 
***** 

Der Benutzer darf nicht eingeben int startDate = 3; die ganze Zeit. Er kann startDate = 1 eingeben (hier wird die Monatsanzeige vom 1. Monat starten, also Jan) oder er kann ein beliebiges StartDate eingeben, also muss der Code für alle funktionieren.

Hinweis: Bitte beachten Sie, dass das gewünschte Teil in keinem Fall falsch ist. Im Falle von vierteljährlich muss ich 3 haben, weil es 4 Viertel von "3" in einem Jahr gibt (es basiert auf anderen Berechnungen meiner Software), also, wenn Benutzer "Viertel" auswählt, muss es "jan-mar" (if start date is first jan) then apr-jun then jul-sep then oct-dec" anzeigen. Ähnlich für halbjährlich jan-jun then jul-dec

+0

Ich denke, die gewünschte Ausgabe für '" Quaterly "' ist falsch. Vierteljährlich ist 4 Mal pro Jahr, aber Sie haben 7 oder 8, je nachdem, was die letzte darstellt – Plutonix

+0

Ich denke, die gewünschte Ausgabe für "SemiAnual" ist auch falsch. Meiner Meinung nach sollte es nur "März" und "September" sein. Sie sollten erklären, wie diese gewünschten Ausgänge gebildet werden. –

+0

@thanks alle bitte beachten Sie die Hinweise: Teil meines Codes, um Ihre Zweifel zu beseitigen. – struggling

Antwort

1

Hier ist Ihr angepasster Code. Es verschiebt das aktuelle Intervall um die angegebene Intervalllänge.Nichts besonderes:

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

Schnell und perfekt :) es würde mir sehr gut gefallen, wenn Sie bitte lassen Sie mich die Art und Weise zu zeigen wie: März, 2016-August 2016 dann September, 2016-Februar 2017 (Falls startDate 3 ist, numCycle = 12 und checkBoxSelecionStatus = "SemiAnual", meine ich mit Jahr. – struggling

+0

Siehe das Update. –

+0

vielen Dank – struggling

1

Für diejenigen, die einen anderen Ansatz vorziehen könnte, hier ist mein „Linqified“ -Version.

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("****"); 
    } 

} 

einfach die period Variable ändern Sie zu reflektieren, wie viele Monate in einer Zeit benötigen Der Sonderfall ist, wenn Periode = = 1, dann ist die Ausgabe kein Bereich, sondern einzelne Monate

EDIT: Hinzugefügt Jahr

Verwandte Themen