是否有快速而简单的方法来获得List<DateTime>
给定的开始和结束日期?
我显然知道我可以通过循环来实现这一点,但我想知道是否有更智能的方法使用Linq或其他一些实用程序。
注意我需要在两个特定日期之间获得DateTime
实例每天。
答案 0 :(得分:6)
迭代器块很适合这个。
我认为没有理由不在此处使用for
循环。你需要为每个日期执行一些运算符,因为你有很多输出,没有方法会有更好的渐近复杂度。
public static IEnumerable<DateTime> GetDates(DateTime startDate, DateTime endDate
, TimeSpan interval)
{
for (DateTime date = startDate; date < endDate; date.Add(interval))
{
yield return date;
}
}
您也可以为固定间隔添加重载:
public static IEnumerable<DateTime> GetDays(DateTime startDate, DateTime endDate)
{
return GetDates(startDate, endDate, TimeSpan.FromDays(1));
}
答案 1 :(得分:3)
您可以这样做以获取从startDate
到endDate
的列表:
List<DateTime> dates =
Enumerable.Range(0, (int)((endDate - startDate).TotalDays) + 1)
.Select(n => startDate.AddDays(n))
.ToList();
答案 2 :(得分:1)
延迟评估的查询可能如下所示:
//inclusive start and inclusive end
public IEnumerable<DateTime> DateSequence(DateTime start, TimeSpan interval, DateTime end)
{
DateTime current = start;
while(current <= end)
{
yield return current;
current = current.Add(interval);
}
}
现在你可以像下面这样简单地使用它。要将每天设置的时间间隔设为TimeSpan.FromDays(1)
var start = DateTime.Now;
var end = DateTime.Now.AddDays(7);
var interval = TimeSpan.FromDays(1);
var sequence = DateSequence(start, interval, end);
//LinqPad specific call
sequence.Dump();
打印:
1/14/2013 5:34:57 PM
1/15/2013 5:34:57 PM
1/16/2013 5:34:57 PM
1/17/2013 5:34:57 PM
1/18/2013 5:34:57 PM
1/19/2013 5:34:57 PM
1/20/2013 5:34:57 PM
答案 3 :(得分:1)
假设您想要每日粒度,并包括开始日期和结束日期:
var start = new DateTime(2012, 01, 01);
var end = new DateTime(2013, 01, 01);
var daysInBetween = Enumerable.Range(0, (int) (end - start).TotalDays + 1)
.Select(value => start.AddDays(value));