using System.Collections.Generic;
public static void Main()
Console.WriteLine("Flight Builder");
public interface IFlightFilter
IList<Flight> Filter(IList<Flight> flights);
public sealed class FlightBuilder
public IList<Flight> GetFlights()
var threeDaysFromNow = DateTime.Now.AddDays(3);
CreateFlight(threeDaysFromNow, threeDaysFromNow.AddHours(2)),
CreateFlight(threeDaysFromNow, threeDaysFromNow.AddHours(2), threeDaysFromNow.AddHours(3), threeDaysFromNow.AddHours(5)),
CreateFlight(threeDaysFromNow.AddDays(-6), threeDaysFromNow),
CreateFlight(threeDaysFromNow, threeDaysFromNow.AddHours(-6)),
CreateFlight(threeDaysFromNow, threeDaysFromNow.AddHours(2), threeDaysFromNow.AddHours(5), threeDaysFromNow.AddHours(6)),
CreateFlight(threeDaysFromNow, threeDaysFromNow.AddHours(2), threeDaysFromNow.AddHours(3), threeDaysFromNow.AddHours(4), threeDaysFromNow.AddHours(6), threeDaysFromNow.AddHours(7))
private static Flight CreateFlight(params DateTime[] dates)
if (dates.Length % 2 != 0)
throw new ArgumentException("You must pass an even number of dates,", "dates");
var departureDates = dates.Where((date, index) => index % 2 == 0);
var arrivalDates = dates.Where((date, index) => index % 2 == 1);
var segments = departureDates
.Zip(arrivalDates, (departureDate, arrivalDate) => new Segment { DepartureDate = departureDate, ArrivalDate = arrivalDate })
return new Flight { Segments = segments };
public IList<Segment> Segments { get; set; }
public DateTime DepartureDate { get; set; }
public DateTime ArrivalDate { get; set; }