[英]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.