如何按以下顺序显示月份名称

时间:2016-04-16 16:17:27

标签: c# algorithm data-structures

我遇到的情况是我必须编写一个代码来打印给定时间间隔内所有月份的名称。 将有4种方式显示间隔名称。

(1。)每年(1个周期)

(2。)SemiAnnually(6个周期)

(3。)季度(3个周期)

(4。)每月(12个周期)

用户提供3个输入,一个是开始日期,另一个是周期。因此月份名称显示必须从用户选择的startDate月开始,必须在他输入的周期结束,第三个输入将是checkBoxSelecionStatus,他将在其中输入“Monthly”(12),“Yearly”(1),“Quarterly” (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个月开始,即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

2 个答案:

答案 0 :(得分: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,那么输出不是范围,而是单个月。

编辑:添加年份

答案 1 :(得分:1)

这是您改编的代码。它只是将当前间隔提前指定的间隔长度。没什么特别的:

#menu