List<DateTime>
特定の開始日と終了日を取得する迅速かつ簡単な方法はありますか?
ループでこれを達成できることは明らかですが、Linqまたはその他のユーティリティを使用したよりスマートな方法があるかどうか疑問に思っています。
注: 2 つの日付の間の毎日DateTime
のインスタンスを取得する必要があります。
イテレータブロックはこれに最適です。
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));
}
次のリストを取得するには、次のようにしstartDate
ますendDate
。
List<DateTime> dates =
Enumerable.Range(0, (int)((endDate - startDate).TotalDays) + 1)
.Select(n => startDate.AddDays(n))
.ToList();
遅延評価されたクエリは次のようになります。
//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
毎日の粒度が必要で、開始日と終了日を含めると仮定します。
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));