过去DateTimes的C#列表

时间:2010-01-25 19:15:17

标签: c# datetime

我有一个返回过去 x 天的方法,它目前执行以下操作:

var dates = new List<DateTime>();

for (int i = 0; i < numDays; i++)
{
    dates.Add(DateTime.Today.AddDays(-i));
}

return dates;

我觉得应该采用更紧凑的方式来实现这一点,也许使用LINQ。建议?另外,如果我按照我的方式保留它,则为DateTime.Today,这样如果我将它存储在循环外的变量中然后在循环内的该值上调用AddDays,这将更有效?

编辑:LINQ使用延迟评估,对吗?我的头脑中有疯狂的图像:

return DateTime.AllDaysInTheHistoryOfTimeEver.Where(day =>
    day.BeforeOrOn(DateTime.Today) &&
    day.After(DateTime.Today.AddDays(-numDays))
);

4 个答案:

答案 0 :(得分:12)

var start = DateTime.Today;
var days = Enumerable.Range(0, numDays).Select(i => start.AddDays(-i)).ToList();

首先捕获start避免在午夜左右运行它的角落。

答案 1 :(得分:1)

也许不是linq,但你可以用迭代器来做,不确定你的确切要求(即numDays),但下面的内容将为你提供最后10天。

var dates = GetDates(DateTime.Now.AddDays(-10),DateTime.Now);

 public IEnumerable<DateTime> GetDates(DateTime StartingDate, DateTime EndingDate)
        {
            while (StartingDate <= EndingDate)
            {
                yield return StartingDate;
                StartingDate = StartingDate.AddDays(1);
            }
        } 

答案 2 :(得分:1)

Marc的回答提供了一个更有说服力的理由来捕捉开始时间,但反射器是我内疚的乐趣之一,所以我检查并发现捕捉开始时间也会更有效率(尽管......嗯,你知道,不太重要,等等。)

当您致电DateTime.Today时,它会返回UtcNow.ToLocalTime(),与使用已经DateTimeKind.Local的日期相比,这会增加一些处理开销:

public virtual DateTime ToLocalTime(DateTime time)
{
    if (time.Kind == DateTimeKind.Local)
    {
        return time;
    }
    bool isAmbiguousLocalDst = false;
    long utcOffsetFromUniversalTime = ((CurrentSystemTimeZone) CurrentTimeZone).GetUtcOffsetFromUniversalTime(time, ref isAmbiguousLocalDst);
    return new DateTime(time.Ticks + utcOffsetFromUniversalTime, DateTimeKind.Local, isAmbiguousLocalDst);
}

答案 3 :(得分:0)

您可以返回IEnumerator或IEnumerable而不是收集列表中的值,而是使用yield关键字。

请参阅MSDN文章