首页 > 解决方案 > 动态更改月份列表

问题描述

我被困在一个要求中。我从 中得到两个标志database,即lastMonthNumberlastMonthName,它们的范围可以是1 to 12January to December。现在我有一个要求,如果lastMonthName="March"lastMonthNumner=12,那么父母list应该如下:

1, April
2, May
3, June
4, July
5, August
6, September
7, October
8, November
9, December
10, January
11, February
12, March

如果lastMonthName="April"lastMonthNumber=6,那么列表应该是:

7, November
8, December
9, January
10, February
11, March
12, April

lastMonthNumber可以从1 to 12lastMonthName可以从Jan to Dec。父母list需要是动态的。

如果lastMonthNumber=6lastMonthName="April",则list需要有 6 个元素,其中 April 为 12 并且回溯到总共有 6 个元素。

父级list可以是 a dictionary,例如:

var monthsDictionary=new Dictionary<int, string>();

我正在尝试以下方法,但无法进一步可视化:

var monthsDictionary = new Dictionary<int, string>();
var numbers = new List<int> { 1,2,3,4,5,6,7,8,9,10,11,12};
var months = new List<string> {"January","February","March","April","May","June","July","August","September","October","November","December" };
 foreach (var month in months.Select())
     {
         if (month == lastMonthName)
            {

            }
      }

请帮忙。指针将非常有帮助。

标签: c#linqforeach

解决方案


有一个带有月份名称的常量

private readonly string[] monthNames = { "Januar" ..., "December" };

以及能够循环索引的访问器方法:

private string GetMonthName(int index)
{
  if (index < 0) return monthNames[monthNames.Length - 1 - (index % monthNames.Length)];
  return monthNames[index % monthNames.Length];
}

然后创建列表:

int indexOfLastMonthName = Array.IndexOf(monthNames, lastMonthName);

var parentData = Enumerable
  // Create as many items as last month number
  .Range(0, lastMonthNumber)

  // Create the list in reverse order, start on LastMonthName and 12,
  // then go back with every item
  .Select(x => new 
  { 
    Number = 12 - x, 
    Name = GetMonthName(indexOfLastMonthName - x)
  }

  // Turn it back
  .Reverse();

然后将其填充到适当的数据结构中。例如像这样:

List<Tuple<int, string>> parentList = parentData
  .Select(x => Tuple.Create(x.Number, x.Name)))
  .ToList();

如果您更喜欢经典解决方案(使用GetMonthName上面的方法):

int indexOfLastMonthName = Array.IndexOf(monthNames, lastMonthName);
List<Tuple<int, string>> parentList = new List<Tuple<int, string>>();

for(int i = 0; i < lastMonthNumber; i++)
{
  parentList.Add(
    Tuple.Create(
      12 - i, 
      GetMonthName(indexOfLastMonthName - i));
}

parentList.Reverse();

推荐阅读