fork(1) download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. public static class Program {
  5. public static void Main() {
  6. Tuple<DateTime,DateTime> range=Tuple.Create(new DateTime(2015,1,1),new DateTime(2015,1,30));
  7. Tuple<DateTime,DateTime>[] exclude=new[] {
  8. Tuple.Create(new DateTime(2015,1,5),new DateTime(2015,1,10)),
  9. Tuple.Create(new DateTime(2015,1,15),new DateTime(2015,1,20)),
  10. Tuple.Create(new DateTime(2015,1,22),new DateTime(2015,1,28))
  11. };
  12. foreach(Tuple<DateTime,DateTime> r in ExcludeIntervals(range,exclude)) {
  13. Console.WriteLine("{0} - {1}",r.Item1,r.Item2);
  14. }
  15. }
  16. public static IEnumerable<Tuple<DateTime,DateTime>> ExcludeIntervals(Tuple<DateTime,DateTime> range,IEnumerable<Tuple<DateTime,DateTime>> exclude) {
  17. IEnumerable<Tuple<DateTime,bool>> dates=
  18. new[] { Tuple.Create(range.Item1.AddDays(-1),true),Tuple.Create(range.Item2.AddDays(1),false) }.
  19. Concat(exclude.SelectMany(r => new[] { Tuple.Create(r.Item1,false),Tuple.Create(r.Item2,true) })).
  20. OrderBy(d => d.Item1).ThenBy(d => d.Item2);
  21. DateTime firstFreeDate=default(DateTime);
  22. int count=1;
  23. foreach(Tuple<DateTime,bool> date in dates) {
  24. if(date.Item2) {
  25. if(--count==0) {
  26. firstFreeDate=date.Item1.AddDays(1);
  27. }
  28. } else {
  29. if(++count==1) {
  30. DateTime lastFreeDate=date.Item1.AddDays(-1);
  31. if(lastFreeDate>=firstFreeDate) {
  32. yield return Tuple.Create(firstFreeDate,lastFreeDate);
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }
Success #stdin #stdout 0.08s 24568KB
stdin
Standard input is empty
stdout
1/1/2015 12:00:00 AM - 1/4/2015 12:00:00 AM
1/11/2015 12:00:00 AM - 1/14/2015 12:00:00 AM
1/21/2015 12:00:00 AM - 1/21/2015 12:00:00 AM
1/29/2015 12:00:00 AM - 1/30/2015 12:00:00 AM