web-dev-qa-db-ja.com

2つの日付の間のすべての日付の配列またはリストを作成します

X軸に沿った日付で複数シリーズのグラフを生成しています。

問題は、グラフ内のすべての系列の日付範囲が同じ日付ではないことです。つまり、2月1日から4月30日までを選択すると、1つのシリーズには2月1日から3月の終わりまでしかデータがなく、別のシリーズには日付範囲全体のデータが含まれることがあります。

これにより、作成する必要があるグラフが歪められます。クエリの開始時に取得された日付範囲を考慮して、日付のリストを生成し、グラフ化するデータを入力し、データのない日付にそれらのシリーズに0を埋め込みます。

126
Andy Evans

LINQ:

Enumerable.Range(0, 1 + end.Subtract(start).Days)
          .Select(offset => start.AddDays(offset))
          .ToArray(); 

Forループ:

var dates = new List<DateTime>();

for (var dt = start; dt <= end; dt = dt.AddDays(1))
{
   dates.Add(dt);
}

編集:時系列のデフォルトで値をパディングする場合は、完全な日付範囲内のすべての日付を列挙し、日付が存在する場合は直接値を選択し、そうでない場合はデフォルトを選択することができます。例えば:

var paddedSeries = fullDates.ToDictionary(date => date, date => timeSeries.ContainsDate(date) 
                                               ? timeSeries[date] : defaultValue);
291
Ani
public static IEnumerable<DateTime> GetDateRange(DateTime startDate, DateTime endDate)
{
    if (endDate < startDate)
        throw new ArgumentException("endDate must be greater than or equal to startDate");

    while (startDate <= endDate)
    {
        yield return startDate;
        startDate = startDate.AddDays(1);
    }
}
30
Anthony Pegram

私はこれが古い投稿であることを知っていますが、拡張メソッドを使用してみてください:

    public static IEnumerable<DateTime> Range(this DateTime startDate, DateTime endDate)
    {
        return Enumerable.Range(0, (endDate - startDate).Days + 1).Select(d => startDate.AddDays(d));
    }

そして、このように使用します

    var dates = new DateTime(2000, 1, 1).Range(new DateTime(2000, 1, 31));

自由に日付を選択してください。2000年1月に制限する必要はありません。

25
Steve Adams

私たちの住むマエストロであるJon Skeetは素晴らしい Range Class を持っています。これはDateTimesや他の型に対してこれを行うことができます。

4
Dan Diplo
list = list.Where(s => s.startDate >= Input_startDate && s.endDate <= Input_endDate);

1
lici abdu