C# 指定した期間内に冬季は何日間含まれるか


お世話になります。

C#のDateTimeやTimeSpanを使用して、指定した期間の中に、冬季(12/1から3/31)が  
何日間含まれているかを求めたいのですが、そういったメソッドなどはありますでしょうか。

一つ一つ計算していけば、力技でもできる気はしますが、要は、すでに用意されている  
メソッドなどでシンプルに作成したいと思っています。

うるう年が入っていたり、期間が二年以上またがっていたりすると、  
なかなか複雑になってきます。

極力シンプルにできる方法がありましたら、教えてください。

よろしくお願いいたします。




真面目に数えるしかないように思いました。  
siamcatsさんが提案するようにひと月ずつ数えることもできるかもしれませんが、期間が何千年も含まれるのでなければ１日ずつ確認しても現実的な計算時間に収まるのではないでしょうか？
（１年で365回ループですし。）

[code]

    public static int GetWinterDays(DateTime start, DateTime end) {
        var count = 0;
        for (var date = start; date < end; date = date.AddTicks(TimeSpan.TicksPerDay)) {
            var month = date.Month;
            if (month <= 3 || 12 <= month)
                count++;
        }
        return count;
    }
    
[/code]

冬季の定義とか、境界を含む含まないとか問題に合わせて調整してください。

補足：  
kaorunさんの回答はLINQらしくするために`Enumerable.Range()`を使っていますが、そのせいで開始日終了日を含むかどうかがコードから読み取り辛くなっています。forループは泥臭いですが、ループの開始値と終了条件が分かりやすいため、このコードを提案しました。  
ちなみに [EnumerableEx.Generate()](https://github.com/Reactive-
Extensions/Rx.NET/blob/a13e3ff05bdded5cef2bf40bface22f8fa4ae316/Ix.NET/Source/System.Interactive/EnumerableEx.Creation.cs#L123)
を使うことで

[code]

    public static int GetWinterDays(DateTime start, DateTime end) {
        return EnumerableEx.Generate(start,
                                     date => date < end,
                                     date => date.AddTicks(TimeSpan.TicksPerDay),
                                     date => date.Month)
            .Count(month => month <= 3 || 12 <= month);
    }
    
[/code]

と書くこともできます。




やってることはsayuriさんの回答と全く同じですが、よりC#らしくLinqで練ってみました。

[code]

    private static int CountWinterDays(DateTime start, DateTime end)
    {
        return Enumerable.Range(0, (end - start).Days)
            .Select(c => start.AddDays(c))
            .Count(d => d.Month <= 3 || d.Month >= 12);
    }
    
[/code]

ワンライナーにもできますし、多少すっきりすると思います。

