using System.Collections.Generic;
public static void Main()
Console.WriteLine("Flight Builder");
var allFlights = new FlightBuilder().GetFlights();
foreach (var flight in allFlights)
Console.WriteLine(flight);
public interface IFlightFilter
IList<Flight> Filter(IList<Flight> flights);
public sealed class FlightBuilder
public IList<Flight> GetFlights()
var threeDaysFromNow = DateTime.Now.AddDays(3);
CreateFlight(1, threeDaysFromNow, threeDaysFromNow.AddHours(2)),
CreateFlight(2, threeDaysFromNow, threeDaysFromNow.AddHours(2), threeDaysFromNow.AddHours(3), threeDaysFromNow.AddHours(5)),
CreateFlight(3, threeDaysFromNow.AddDays(-6), threeDaysFromNow),
CreateFlight(4, threeDaysFromNow, threeDaysFromNow.AddHours(-6)),
CreateFlight(5, threeDaysFromNow, threeDaysFromNow.AddHours(2), threeDaysFromNow.AddHours(5), threeDaysFromNow.AddHours(6)),
CreateFlight(6, threeDaysFromNow, threeDaysFromNow.AddHours(2), threeDaysFromNow.AddHours(3), threeDaysFromNow.AddHours(4), threeDaysFromNow.AddHours(6), threeDaysFromNow.AddHours(7))
private static Flight CreateFlight(int id, 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 })
public int Id { get; set; }
public IList<Segment> Segments { get; set; }
public override string ToString() => $"Id: {Id}, Segments: {string.Join(", ", Segments.Select(s => s.ToString()))}";
public DateTime DepartureDate { get; set; }
public DateTime ArrivalDate { get; set; }
public override string ToString() => $"DepartureDate: {DepartureDate}, ArrivalDate: {ArrivalDate}";