【问题标题】:Exploding a range of dates with LINQ使用 LINQ 扩展日期范围
【发布时间】:2010-04-17 02:09:19
【问题描述】:

如果我有一对日期,并且我想生成它们之间所有日期的列表(包括),我可以执行以下操作:

System.DateTime s = new System.DateTime(2010, 06, 05);
System.DateTime e = new System.DateTime(2010, 06, 09);
var list = Enumerable.Range(0, (e - s).Days)
    .Select(value => s.AddDays(value));

我坚持的是,我有一个日期对列表,我想将它们分解为它们之间所有日期的列表。示例:

{2010-05-06, 2010-05-09}, {2010-05-12, 2010-05-15}

应该会导致

{2010-05-06, 2010-05-07, 2010-05-08, 2010-05-09, 2010-05-12, 2010-05-13, 2010-05-14, 2010-05-15}

请注意,日期对保证不会相互重叠。

【问题讨论】:

  • 是的,Days != TotalDays,但是 Days 是我想要的。请参阅您提供的链接中的示例: TimeSpan( 1 ).Days == 0;时间跨度(1).TotalDays == 1.15740740740741E-12;时间跨度(111222333444555).天== 128;时间跨度(111222333444555).TotalDays == 128.729552597865;在第一个示例中,循环 0..0 将给出一天,这正是我想要的。在第二个示例中,循环 0..128 将给出 129 天,这也是我想要的。我想我可以循环 1..ceil(128.729552597865) 然后返回 s.AddDays(value - 1),但我为什么要这样做?
  • 只是指出,当两个 DateTime 值相隔一个多月时,使用 Days 会中断。 :)

标签: c# linq


【解决方案1】:
var result = listOfPairs.SelectMany(pair =>
                 Enumerable.Range(0, (pair.Item2 - pair.Item1).TotalDays)
                           .Select(days => pair.Item1.AddDays(days)));

【讨论】:

  • 是的,这就是我一直在寻找的:一种 LINQy 可扩展的做法。太棒了,谢谢。
  • 这对我很有用。我只需要分解一个日期范围,这就是我使用的:Enumerable.Range(0, (int)(endDate - startDate).TotalDays).Select(days => startDate.AddDays(days));。请注意,我必须将 1 天添加到 EndDate 以确保最后一天在那里。
【解决方案2】:

我认为你可以使用一个简单的List<DateTime> 来完成你想要的。

List<DateTime> list = new List<DateTime>();
list.AddRange(GetListDates(d1, d2));
list.AddRange(GetListDates(d3, d4));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-30
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多