Изменить список месяцев динамически - PullRequest
0 голосов
/ 25 сентября 2018

Я застрял в требовании.Я получаю два флага от database, а именно lastMonthNumber и lastMonthName, они могут варьироваться от 1 to 12 и January 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 12 и lastMonthName также может варьироваться от Jan to Dec.Родительский list должен быть динамическим.

Если lastMonthNumber=6 и lastMonthName="April", то list должен иметь 6 элементов с апрелем как 12 и backtrack, чтобы иметь всего 6 элементов.

Родитель list может быть 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)
            {

            }
      }

Пожалуйста помоги.Указатели будут очень полезны.

Ответы [ 5 ]

0 голосов
/ 25 сентября 2018

попробуйте следующее:

        var months = Enumerable.Range(1, 12).Select(i => new
        {
            I = i,
            M = System.Globalization.DateTimeFormatInfo.CurrentInfo.GetMonthName(i)
        });

        //string lastMonthName = "March"; int lastMonthNumber = 12;
        //string lastMonthName = "April"; int lastMonthNumber = 6;
        var selMonthInt = months.Where(x => x.M == lastMonthName).Select(y => y.I).FirstOrDefault();
        int endCount = lastMonthNumber + selMonthInt;
        if (endCount >= 12) { endCount = selMonthInt; }

        var lst1 = months.Where(x => x.I > endCount).Select(z => z.M);
        var lst2 = months.Where(x => x.I <= selMonthInt).Select(z => z.M);
        var lst = lst1.Union(lst2).ToArray();

        var selMonths = Enumerable.Range(0, lastMonthNumber).Select(i => new { I = (13 - lastMonthNumber + i), M = lst[i] });
0 голосов
/ 25 сентября 2018

попробуйте приведенную ниже скрипку.https://dotnetfiddle.net/GYP2Go

private static Dictionary<int, string> GetRequiredResult(int lastMonthNumber, string lastMonthName)
{
    var indx =  months.IndexOf(lastMonthName);

    // here this list will have months in required order that ends with lastMonthName
    var revisedMonthList = new List<string>();
    revisedMonthList.AddRange(months.Skip(indx + 1).Take(12));
    revisedMonthList.AddRange(months.Take(indx + 1));

    // get count = lastMonthNumber element from last using index, and then convert them to dictionary.
    return revisedMonthList
        .Select((mn, index) => new {index, mn})
        .Where(c => c.index >= months.Count - lastMonthNumber)
        .ToDictionary(c=>c.index + 1, c=>c.mn); 
}
0 голосов
/ 25 сентября 2018

Иметь константу с названиями месяцев

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();
0 голосов
/ 25 сентября 2018

Попробуйте этот запрос linq

var months = new List<string> {"January","February","March","April","May","June","July","August","September","October","November","December" };

var lastMonthNumber = ...;
var lastMonthName = ....;

var rows = months.Concat(months)
    .Reverse()
    .SkipWhile(m => m != lastMonthName)
    .Take(lastMonthNumber)
    .Reverse()
    .Select((m, i) => new { id = i + 12 - lastMonthNumber + 1, m})
    .ToArray();

Он дублирует список месяцев, переворачивает его и пропускает элементы, пока не будет найдено lastMonthName.После этого этот код ограничивает количество элементов результата до lastMonthNumber и обратный список обратно

0 голосов
/ 25 сентября 2018
    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" };
int flag=0;
int items=12;
var numbersList = new List<int>();
var monthsList = new List<string>(); 
     foreach (var month in months)
         {
            if(flag==0){
             monthsList.Insert(items--,month);
             if (month == lastMonthName)
                {
                    flag=1;
                }
}
         else if(flag==1)
         {
           monthsList.add(month);
          }
          }
flag=0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...