using System;
using System.Collections .Generic ;
using System.Linq ;
public static class Program {
public static void Main( ) {
Tuple< DateTime, DateTime> range= Tuple.Create ( new DateTime( 2015 , 1 , 1 ) , new DateTime( 2015 , 1 , 30 ) ) ;
Tuple< DateTime, DateTime> [ ] exclude= new[ ] {
Tuple.Create ( new DateTime( 2015 , 1 , 5 ) , new DateTime( 2015 , 1 , 10 ) ) ,
Tuple.Create ( new DateTime( 2015 , 1 , 15 ) , new DateTime( 2015 , 1 , 20 ) ) ,
Tuple.Create ( new DateTime( 2015 , 1 , 22 ) , new DateTime( 2015 , 1 , 28 ) )
} ;
foreach( Tuple< DateTime, DateTime> r in ExcludeIntervals( range, exclude) ) {
Console.WriteLine ( "{0} - {1}" , r.Item1 , r.Item2 ) ;
}
}
public static IEnumerable< Tuple< DateTime, DateTime>> ExcludeIntervals( Tuple< DateTime, DateTime> range, IEnumerable< Tuple< DateTime, DateTime>> exclude) {
IEnumerable< Tuple< DateTime, bool>> dates=
new[ ] { Tuple.Create ( range.Item1 .AddDays ( - 1 ) , true ) , Tuple.Create ( range.Item2 .AddDays ( 1 ) , false ) } .
Concat ( exclude.SelectMany ( r => new[ ] { Tuple.Create ( r.Item1 , false ) , Tuple.Create ( r.Item2 , true ) } ) ) .
OrderBy ( d => d.Item1 ) .ThenBy ( d => d.Item2 ) ;
DateTime firstFreeDate= default ( DateTime) ;
int count= 1 ;
foreach( Tuple< DateTime, bool> date in dates) {
if ( date.Item2 ) {
if ( -- count== 0 ) {
firstFreeDate= date.Item1 .AddDays ( 1 ) ;
}
} else {
if ( ++ count== 1 ) {
DateTime lastFreeDate= date.Item1 .AddDays ( - 1 ) ;
if ( lastFreeDate>= firstFreeDate) {
yield return Tuple.Create ( firstFreeDate, lastFreeDate) ;
}
}
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvZ3JhbSB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpIHsKICAgICAgICBUdXBsZTxEYXRlVGltZSxEYXRlVGltZT4gcmFuZ2U9VHVwbGUuQ3JlYXRlKG5ldyBEYXRlVGltZSgyMDE1LDEsMSksbmV3IERhdGVUaW1lKDIwMTUsMSwzMCkpOwogICAgICAgIFR1cGxlPERhdGVUaW1lLERhdGVUaW1lPltdIGV4Y2x1ZGU9bmV3W10gewogICAgICAgICAgICBUdXBsZS5DcmVhdGUobmV3IERhdGVUaW1lKDIwMTUsMSw1KSxuZXcgRGF0ZVRpbWUoMjAxNSwxLDEwKSksCiAgICAgICAgICAgIFR1cGxlLkNyZWF0ZShuZXcgRGF0ZVRpbWUoMjAxNSwxLDE1KSxuZXcgRGF0ZVRpbWUoMjAxNSwxLDIwKSksCiAgICAgICAgICAgIFR1cGxlLkNyZWF0ZShuZXcgRGF0ZVRpbWUoMjAxNSwxLDIyKSxuZXcgRGF0ZVRpbWUoMjAxNSwxLDI4KSkKICAgICAgICB9OwogICAgICAgIGZvcmVhY2goVHVwbGU8RGF0ZVRpbWUsRGF0ZVRpbWU+IHIgaW4gRXhjbHVkZUludGVydmFscyhyYW5nZSxleGNsdWRlKSkgewogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiezB9IC0gezF9IixyLkl0ZW0xLHIuSXRlbTIpOwogICAgICAgIH0KICAgIH0KICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8VHVwbGU8RGF0ZVRpbWUsRGF0ZVRpbWU+PiBFeGNsdWRlSW50ZXJ2YWxzKFR1cGxlPERhdGVUaW1lLERhdGVUaW1lPiByYW5nZSxJRW51bWVyYWJsZTxUdXBsZTxEYXRlVGltZSxEYXRlVGltZT4+IGV4Y2x1ZGUpIHsKICAgICAgICBJRW51bWVyYWJsZTxUdXBsZTxEYXRlVGltZSxib29sPj4gZGF0ZXM9CiAgICAgICAgICAgIG5ld1tdIHsgVHVwbGUuQ3JlYXRlKHJhbmdlLkl0ZW0xLkFkZERheXMoLTEpLHRydWUpLFR1cGxlLkNyZWF0ZShyYW5nZS5JdGVtMi5BZGREYXlzKDEpLGZhbHNlKSB9LgogICAgICAgICAgICBDb25jYXQoZXhjbHVkZS5TZWxlY3RNYW55KHIgPT4gbmV3W10geyBUdXBsZS5DcmVhdGUoci5JdGVtMSxmYWxzZSksVHVwbGUuQ3JlYXRlKHIuSXRlbTIsdHJ1ZSkgfSkpLgogICAgICAgICAgICBPcmRlckJ5KGQgPT4gZC5JdGVtMSkuVGhlbkJ5KGQgPT4gZC5JdGVtMik7CiAgICAgICAgRGF0ZVRpbWUgZmlyc3RGcmVlRGF0ZT1kZWZhdWx0KERhdGVUaW1lKTsKICAgICAgICBpbnQgY291bnQ9MTsKICAgICAgICBmb3JlYWNoKFR1cGxlPERhdGVUaW1lLGJvb2w+IGRhdGUgaW4gZGF0ZXMpIHsKICAgICAgICAgICAgaWYoZGF0ZS5JdGVtMikgewogICAgICAgICAgICAgICAgaWYoLS1jb3VudD09MCkgewogICAgICAgICAgICAgICAgICAgIGZpcnN0RnJlZURhdGU9ZGF0ZS5JdGVtMS5BZGREYXlzKDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYoKytjb3VudD09MSkgewogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lIGxhc3RGcmVlRGF0ZT1kYXRlLkl0ZW0xLkFkZERheXMoLTEpOwogICAgICAgICAgICAgICAgICAgIGlmKGxhc3RGcmVlRGF0ZT49Zmlyc3RGcmVlRGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gVHVwbGUuQ3JlYXRlKGZpcnN0RnJlZURhdGUsbGFzdEZyZWVEYXRlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0=