using System.Collections.Generic;
public static void Main()
List<Time> availableTimes = new List<Time>
new Time { From = new DateTime(2018, 1, 15), To = new DateTime(2018, 1, 19), ResourceId = 1 },
new Time { From = new DateTime(2018, 1, 15), To = new DateTime(2018, 1, 16), ResourceId = 2 },
new Time { From = new DateTime(2018, 1, 16), To = new DateTime(2018, 1, 19), ResourceId = 3 },
new Time { From = new DateTime(2018, 1, 15), To = new DateTime(2018, 1, 19), ResourceId = 4 },
new Time { From = new DateTime(2018, 1, 16), To = new DateTime(2018, 1, 17), ResourceId = 5 },
new Time { From = new DateTime(2018, 1, 17), To = new DateTime(2018, 1, 18), ResourceId = 2 },
new Time { From = new DateTime(2018, 1, 17), To = new DateTime(2018, 1, 18), ResourceId = 5 },
new Time { From = new DateTime(2018, 1, 16), To = new DateTime(2018, 1, 18), ResourceId = 6 },
new Time { From = new DateTime(2018, 1, 18), To = new DateTime(2018, 1, 19), ResourceId = 2 },
new Time { From = new DateTime(2018, 1, 15), To = new DateTime(2018, 1, 19), ResourceId = 7 },
int numberOfResourcesToBook = 2;
var result = availableTimes
.GroupBy(l => new { l.From, l.To })
Count = g.Select(l => l.ResourceId).Distinct().Count(),
.Where(c => c.Count >= numberOfResourcesToBook);
bool enoughResourceAvailable = result.Any();
var allMatchingTimes = result.SelectMany(c => c.Times);
Console.WriteLine("Enough resources available: " + (enoughResourceAvailable ? "Yes" : "No"));
Console.WriteLine("\nGroups with counts:");
foreach (var t in result)
Console.WriteLine(string.Format("{0} {1} - {2} resources", t.Date.From.ToShortDateString(), t.Date.To.ToShortDateString(), t.Count));
Console.WriteLine("\nMatching items from original list:");
foreach (var t in allMatchingTimes)
Console.WriteLine(string.Format("{0} {1} {2}", t.From.ToShortDateString(), t.To.ToShortDateString(), t.ResourceId));
public DateTime From { get; set; }
public DateTime To { get; set; }
public int ResourceId { get; set; }