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 fligth in flights)
Console.WriteLine(fligth);
int letyCSA = flights.Count(f => f.Carrier == Carrier.CSA);
Console.WriteLine("Pocet letu CSA: {0}", letyCSA);
var chybneLety = flights.Where(f => f.Origin == f.Destination).Select(f=>f.Origin).ToArray();
foreach(var ch in chybneLety)
Console.WriteLine("Chybne lety: {0}", ch);
var bezZpozdeni = flights.Where(f => (f.ScheduledArrival >= f.Arrived));
foreach(var b in bezZpozdeni)
Console.WriteLine("Nemely zpozdeni: {0}", b);
var Prvni = flights.OrderBy(f => f.Departed).FirstOrDefault();
var Posledni = flights.OrderBy(f => f.Arrived).LastOrDefault();
Console.WriteLine("Prvni: {0} \nPosledni: {1}", Prvni, Posledni);
var vUnoru = flights.Any(f => (f.ScheduledArrival.Month == 2 && f.Origin == "Prague" && f.Destination == "Barcelona"));
Console.WriteLine("V unoru neletelo z Prahy do Barcelony nic");
Console.WriteLine("V unoru z Prahy do Barcelony neco letelo");
var prumZpozdeni = flights.Average(f => (f.Arrived - f.ScheduledArrival).Minutes);
Console.WriteLine("Prum zpozdeni je: {0} minut", prumZpozdeni);
var veVzduchu = flights.Sum(f => (f.Arrived - f.Departed).Hours);
Console.WriteLine("Celkem se proletalo hodin: {0} hodin", veVzduchu);
foreach (var skupinaVL in flights.GroupBy(f => f.Origin))
foreach (var skupinaML in skupinaVL.GroupBy((f => f.Destination)))
Console.WriteLine("------------------------\n{0}/{1} - {2}", skupinaVL.Key, skupinaML.Key, skupinaML.Count());
Console.WriteLine("------------------------");
Console.WriteLine("\nVsechna mesta: ");
var serazenaMesta = cities.OrderBy(z => z);
foreach (var m in serazenaMesta)
var pouzeDestinace = flights.GroupBy(f => f.Destination).OrderBy(f => f.Key);
Console.WriteLine("\nDo techto mest se letelo: ");
foreach (var d in pouzeDestinace)
Console.Write(d.Key + ", ");
var nepouziteDestinace = cities.Where(c => !(flights.Any(f => f.Destination == c))).OrderBy(c=>c);
Console.WriteLine("\nDo techto mest se neletelo: ");
foreach (var d in nepouziteDestinace)
Console.WriteLine("\ndelky vsech letů:");
foreach (var d in flights)
Console.Write(d.Arrived - d.Departed + ", ");
var nejdelsiLet = flights.Max(f => f.Arrived - f.Departed);
Console.WriteLine("\nnejdelsi lety jsou {0} dlouhe a jsou to:",nejdelsiLet);
foreach (var l in flights)
if ((l.Arrived - l.Departed) == nejdelsiLet)
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);