CSharp · Console
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
var listings = new[]{
new Listing { ListingDate = new DateTime(2022, 01, 05), ClosingDate = new DateTime(2022, 04, 05) },
new Listing { ListingDate = new DateTime(2022, 01, 10), ClosingDate = new DateTime(2022, 04, 10) },
new Listing { ListingDate = new DateTime(2022, 03, 01), ClosingDate = new DateTime(2022, 07, 01) },
new Listing { ListingDate = new DateTime(2022, 04, 05), ClosingDate = new DateTime(2023, 03, 07) },
};
var listingsByMonth = listings
.SelectMany(l =>
{
return l.ListingDate.GetMonths(l.ClosingDate.AddDays(-1)) // assuming closing date is exclusive
.Select(dt => new KeyValuePair<DateTime, Listing>(dt, l));
})
.ToLookup(kvp => kvp.Key, kvp => kvp.Value);
foreach(var g in listingsByMonth)
{
Console.WriteLine($"{g.Key:yyyy-MM}: {g.Count()}");
}
}
}
public class Listing
{
public DateTime ListingDate { get; set; }
public DateTime ClosingDate { get; set; }
}
public static class Extensions
{
public static IEnumerable<DateTime> GetMonths(this DateTime startDate, DateTime endDate)
{
var monthDiff = (endDate.Month - startDate.Month) + (12 * (endDate.Year - startDate.Year));
var startMonth = new DateTime(startDate.Year, startDate.Month, 1);
return Enumerable.Range(0, monthDiff + 1)
.Select(i => startMonth.AddMonths(i));
}
}