using System.Collections.Generic;
public static void Main()
List<Availability> availability = new List<Availability>
new Availability { StartDate = new DateTime(2015,1,5), EndDate = new DateTime(2015,1,10)},
new Availability { StartDate = new DateTime(2015,1,15), EndDate = new DateTime(2015,1,20)},
new Availability { StartDate = new DateTime(2015,1,22), EndDate = new DateTime(2015,1,28)}
DateTime startDate = new DateTime(2015, 1, 1);
DateTime endDate = new DateTime(2015, 1, 30);
int totalDays = (int)(endDate - startDate).TotalDays + 1;
availability.Add(new Availability { StartDate = endDate, EndDate = endDate });
var result = from x in Enumerable.Range(0, totalDays)
let d = startDate.AddDays(x)
from a in availability.Select((v, i) => new { Value = v, Index = i })
where (a.Index == availability.Count - 1 ?
d <= a.Value.StartDate : d < a.Value.StartDate)
&& (a.Index != 0 ? d > availability[a.Index - 1].EndDate : true)
group new { d, a } by a.Value.StartDate into g
AvailableDates = String.Format("{0} - {1}",g.Min(x => x.d),
foreach(var item in result)
Console.WriteLine(item.AvailableDates);
public class Availability
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }