我有一个返回过去 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))
);
答案 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)
当您致电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文章