[英]How to display month names in following sequence
我處於一種情況下,我必須編寫代碼以打印給定時間間隔內涵蓋的所有月份的名稱。 有四種顯示間隔名稱的方法。
(1.)每年(1個周期)
(2.)半年一次(6個周期)
(3.)每季度(3個周期)
(4.)每月(12個周期)
用戶提供3個輸入,一個是開始日期,另一個是周期。 因此,月份名稱顯示必須從用戶選擇的startDate月份開始,並且必須在他輸入的周期中結束,第三個輸入將是checkBoxSelecionStatus,在該位置他將輸入“每月”(12),“每年”(1),“每季度” (3) “每半年”(6)。 因此,此checkBoxSelecionStatus將決定getMonthByDescription()
函數中for循環的索引跳過
現在必須是輸出:
(1)當用戶在checkBoxSelecionStatus中選擇“ Monthly”,並且numOfCycles變量具有12值並且startDate為3時(通過startDate = 3表示它從3月1日開始到接下來的12個周期(numOfCycle),即明年3月)。 那么輸出應該是在此間隔內的所有12個月。 所以它的輸出是:
Mar
*****
Apr
*****
May
*****
Jun
*****
Jul
*****
Aug
*****
Sep
*****
Oct
*****
Nov
*****
Dec
*****
Jan
*****
Feb
*****
(2)現在,當用戶在cycle = 12中選擇“ SemiAnually”時,它必須顯示
Mar-Aug
*****
Sept-Feb
*****
(3)現在,當用戶在cycle = 12中選擇“ Quaterly”時,它必須顯示:
Mar-May
*****
Jun-Aug
*****
Sep-Nov
*****
Dec-Feb
*****
(4)現在,當用戶在12個周期中選擇“每年”時,它必須顯示:
Mar-Feb
*****
用戶可能不輸入int startDate = 3; 每時每刻。 他可以輸入startDate = 1;(此處的月份顯示將從1月的第一個月開始),或者他可以輸入任何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
對於那些可能喜歡其他方法的人,這是我的“ 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
變量以反映您需要的期間數。 特殊情況是period == 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.