Как извлечь максимальную дату из списка случайных дат, сгруппированных по неделям, месяцам, кварталам или годам? - PullRequest
0 голосов
/ 05 мая 2018

Учитывая список случайных дат, существует ли элегантный способ C # (LINQ или иным образом) для извлечения последней даты в списке, сгруппированной по неделям, месяцам, кварталам или годам?

Надеюсь, это понятно, но если нет, то используйте этот пример набора дат:

  • Пн 01/01/2018
  • Вт 02/01/2018
  • Чт 04/01/2018
  • вт 09.01.01 2018
  • чт 11/01/2018
  • Пт. 12/01/2018
  • Пн 22/01/2018
  • Вт 23.01.01 2018
  • Ср 24/01/2018
  • ср. 31.01 2018
  • Чт 01/02/2018
  • вт. 27/02/2018

Извлечение максимума за неделю даст

  • Чт 04/01/2018 = последняя дата первой недели в выборке
  • Пт. 12/01/2018 = последняя дата второй недели в выборке
  • Ср 24/01/2018 = и т. Д.
  • чт 01/02/2018
  • Вт 27/02/2018

А извлечение максимума по месяцам даст

  • ср. 31/01/2018 = последняя дата января в выборке
  • вт 27/02/2018 = последняя дата февраля в выборке

Мне нужно сделать это извлечение по номеру недели, календарному месяцу, календарному кварталу и календарному году.

Я даже не уверен, с чего начать. Так что в настоящее время у меня нет кода, которым можно поделиться.

Любые идеи будут очень кстати.

РАЗЪЯСНЕНИЕ: названия дней недели включены сюда для пользы нас, людей. Моя фактическая дата - правильные DateTime типы. Таким образом, коду не нужно анализировать строки в DateTimes.

Кроме того, я могу легко написать что-то подобное без LINQ. Но я надеюсь, что это элегантное решение с использованием LINQ или другого хитрого трюка.

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Я остановился на этом в C #, который можно адаптировать для любой другой требуемой группировки

    public static Dictionary<Tuple<int, int>, DateTime> MaxByYearMonth(this List<DateTime> sourceDateTimes)
    {
        IEnumerable<DateTime>                             ordered = sourceDateTimes.OrderBy(x => x.Ticks);
        IEnumerable<IGrouping<Tuple<int, int>, DateTime>> grouped = ordered.GroupBy(x => new Tuple<int, int>(x.Year, x.Month));
        Dictionary<Tuple<int, int>, DateTime>             maxed   = grouped.ToDictionary(x => x.Key, x => x.Max());
        return maxed;
    }
0 голосов
/ 05 мая 2018

Это довольно просто, используя LINQ. Вот пример для группировки по month :

var grouped = dates.OrderBy(x => x.Ticks).GroupBy(x => x.Month)
                   .Select(x => new {Month = x.Key, Max = x.Max()});

Это дает для вашего примера:

{Месяц = ​​1, Макс = 31.01.2008, 00:00:00}

{Месяц = ​​2, Макс = 2/27/2018 12:00:00 AM}


Чтобы сделать это вместо недели , используйте эту лямбду для GroupBy:

x => CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(
         x, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday
     )

Выход:

{Неделя = 1, макс. = 1/4/2018 12:00:00 AM}

{неделя = 2, макс = 12.01.2008, 00:00:00}

{неделя = 4, макс = 24.01.2008, 00:00:00}

{Неделя = 5, макс. = 1/2/2018 12:00:00 AM}

{Неделя = 9, макс. = 2/27/2018 12:00:00 AM}


Для квартала :

x => (x.Month + 2)/3

Выход:

{Quarter = 1, Max = 2/27/2018 12:00:00 AM}


Для года :

x => x.Year

выход

{Год = 2018, Макс = 27.02.2008, 00:00:00}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...