如何在 c# 中将日期列表转换为 DateRanges 列表

问题描述 投票:0回答:3

如何

List<DateTime>
List<List<DateTime>>
那个区别是
1
:

例如列表是

var list = new List<DateTime>()
{
    new DateTime(2023, 05, 02),
    new DateTime(2023, 05, 03),
    new DateTime(2023, 05, 04),
    new DateTime(2023, 05, 10),
    new DateTime(2023, 05, 11),
    new DateTime(2023, 05, 20),
};

我希望我的方法返回这个列表

{
    2023-05-02,
    2023-05-03,
    2023-05-04
},
{
    2023-05-10,
    2023-05-11
},
{
    2023-05-20
}
c# linq date-range
3个回答
0
投票

您可以尝试在 Linq 的帮助下循环并构建答案,例如

using System.Linq;

...

private static List<List<DateTime>> Solve(IEnumerable<DateTime> source) {
  List<List<DateTime>> result = new();
 
  if (source is null)
    return result;

  foreach (var date in source.OrderBy(item => item)) 
    if (result.Count > 0 && result.Last().Last().AddDays(1) == date)
      result.Last().Add(date);
    else
      result.Add(new List<DateTime>() { date });

  return result;
}

0
投票

这是 LINQ 答案:

List<List<DateTime>> result =
    list
        .Skip(1)
        .Aggregate(
            new[] { list.Take(1).ToList() }.ToList(),
            (a, x) =>
            {
                if (x.Subtract(a.Last().Last()).Days != 1)
                {
                    a.Add(new List<DateTime>());
                }
                a.Last().Add(x);
                return a;
            });

这给出了:

注意:这假设

list
已经订购(根据问题中的列表)。


0
投票

循环遍历日期并检查当前日期与前一个日期的差距是否小于 1 天。如果是,则将其添加到当前列表中,否则开始一个新列表。

private List<List<DateTime>> GetListsOfConsecutiveDates(List<DateTime> dates)
{
    var result = new List<List<DateTime>>();

    var currentList = new List<DateTime>();
    var previousDate = dates.First();
    currentList.Add(previousDate);

    foreach (var date in dates.Skip(1))
    {
        if (date - previousDate <= TimeSpan.FromDays(1))
        {
            currentList.Add(date);
        }
        else
        {
            result.Add(currentList);
            currentList = new List<DateTime> { date };
        }

        previousDate = date;
    }

    result.Add(currentList);
    return result;
}
© www.soinside.com 2019 - 2024. All rights reserved.