static Random random = new Random();
static string[] cities = new string[] { "Amsterdam", "Barcelona", "Paris", "Prague", "London", "Rome", "Oslo", "Moscow" };
public static void Main()
var flights = GenerateTestData(10, new DateTime(2018, 1, 1), DateTime.Today, 12, 90);
foreach(var item in flights)
Console.WriteLine(flights.Count(f => f.Carrier == Carrier.CSA));
foreach(var item in flights.Where(f => f.Origin == f.Destination).Select(f => f.Carrier + " " + f.Origin + " " + f.Destination))
Console.WriteLine(item.ToString());
foreach(var item in flights.Where(f => f.ScheduledArrival >= f.Arrived).Select(f => f.Carrier + " " + f.Code))
Console.WriteLine(item.ToString());
Console.WriteLine(flights.OrderBy(f => f.Departed).First().ToString());
Console.WriteLine(flights.OrderBy(f => f.Arrived).Last().ToString());
foreach(var item in flights.Where(f => f.Origin == "Prague" && f.Destination == "Barcelona").Where(f => f.ScheduledDeparture.Month == 2 || f.ScheduledArrival.Month == 2).Select(f => f.Carrier + " " + f.Code))
Console.WriteLine(item.ToString());
Console.WriteLine(flights.Average(f => (f.Arrived - f.ScheduledArrival).Minutes));
Console.WriteLine(flights.Select(f => (f.Arrived - f.Departed).TotalHours).Sum());
foreach(var item in flights.OrderBy(f => f.Origin).GroupBy(f => f.Origin + " to " + f.Destination).ToDictionary(f => f.Key))
Console.WriteLine(item.Key + " " + string.Join(", ", item.Value.Select(z => z.Code)) + ", počet letů: " + item.Value.Count());
var destinations = flights.Select(f => f.Destination).ToList();
foreach(string city in cities)
if(!destinations.Contains(city))
Console.WriteLine("{0} is not a destination", city);
double max = flights.Max(f => (f.Arrived - f.Departed).Hours);
foreach(var item in flights.Where(f => (f.Arrived - f.Departed).Hours == max))
Console.WriteLine(item.ToString());
static Flight[] GenerateTestData(int numberOfFlights, DateTime flightsFromDate, DateTime flightsToDate, int flightMaxHours, int maxDelayMinutes)
throw new ArgumentException("Number of flights has to be more than 0.");
throw new ArgumentException("Flight has to take at least one hour.");
throw new ArgumentException("Max delay has to be positive.");
if (flightsToDate.AddHours(flightMaxHours) < flightsFromDate)
throw new ArgumentException("Date of the flight arrival has to be after the date of its departure including flight max hours.");
var flights = new Flight[numberOfFlights];
int daysInRange = (flightsToDate - flightsFromDate).Days;
var carriers = (Carrier[]) Enum.GetValues(typeof(Carrier));
for (int i = 0; i < numberOfFlights; i++)
var flightDuration = random.Next(1, flightMaxHours + 1);
var randomDayOffset = random.Next(0, daysInRange);
var randomHour = random.Next(0, 23);
var randomDelay = random.Next(0, maxDelayMinutes);
var randomCarrierNumber = random.Next(0, carriers.Length);
var carrier = carriers[randomCarrierNumber];
var randomOrigin = cities[i % cities.Length];
var randomDestination = cities[random.Next(0, cities.Length)];
var randomDepartureDate = flightsFromDate.AddDays(randomDayOffset).AddHours(randomHour);
var departed = randomDepartureDate.AddMinutes(randomDelay);
var randomArrivalDate = randomDepartureDate.AddHours(flightDuration);
var arrived = randomArrivalDate.AddMinutes(randomDelay);
flights[i] = new Flight(carrier, randomOrigin, randomDestination, carrier.ToString()[0] + i.ToString(), randomDepartureDate, departed, randomArrivalDate, arrived);
public Carrier Carrier { get; set; }
public string Origin { get; set; }
public string Destination { get; set; }
public string Code { get; set; }
public DateTime ScheduledDeparture { get; set; }
public DateTime Departed { get; set; }
public DateTime ScheduledArrival { get; set; }
public DateTime Arrived { get; set; }
public Flight(Carrier carrier, string origin, string destination, string code, DateTime scheduledDeparture, DateTime departed, DateTime scheduledArrival, DateTime arrived)
Destination = destination;
ScheduledDeparture = scheduledDeparture;
ScheduledArrival = scheduledArrival;
public override string ToString()
return string.Format("{0} {1} {2} {3} {4} {5} {6} {7}", Carrier, Origin, Destination, Code, ScheduledDeparture, Departed, ScheduledArrival, Arrived);