public IReadOnlyCollection<AirportChain> Search(string[] startAirports, DateTime start, DateTime end) { _chains.Clear(); var flights = _flightsData .Where(flight => start < flight.DateTime && flight.DateTime < end) .OrderBy(flight => flight.DateTime) .ToArray(); var startFlights = _flightsData .Where( flight => start < flight.DateTime && flight.DateTime < end && startAirports.Contains(flight.Departure)) .GroupBy(flight => flight.Arrival) .Select(group => group.OrderBy(flight => flight.DateTime).FirstOrDefault()) .OrderBy(flight => flight.DateTime) .ToList(); AirportChain chain = new AirportChain(); for (int i = 0; i < startFlights.Count; i++) { var startFlight = startFlights[i]; Console.WriteLine("{0} of {1}", i, startFlights.Count); Search(chain.Next(startFlight), startFlight, flights, 1); } return _chains.AsReadOnly(); }
private void Search(AirportChain chain, FlatFlight startFlight, FlatFlight[] flights, int level) { if (_finishAirports.Contains(startFlight.Arrival)) { if (level == _depth) { _chains.Add(chain); } return; } if (level == _depth) { return; } DateTime departureDateTime = startFlight.DateTime.AddHours(_minimalStopHours); int len = flights.Length; int skipCount = 0; for (; skipCount < len; skipCount++) { if (flights[skipCount].DateTime > departureDateTime) { break; } } var xFlights = flights .Skip(skipCount) .ToArray(); if (xFlights.Length == 0) { return; } var startFlights = xFlights .Where(flight => flight.Departure == startFlight.Arrival) .GroupBy(flight => flight.Arrival) .Select(group => group.OrderBy(flight => flight.DateTime).FirstOrDefault()) .ToList(); int count = startFlights.Count; for (int i = 0; i < startFlights.Count; i++) { var flight = startFlights[i]; if (level < 3) { Console.WriteLine("{0} {1} of {2}", new string('>', level), i, count); } Search(chain.Next(flight), flight, xFlights, level + 1); } }
private AirportChain(AirportChain chain, FlatFlight flight) { Airports = new List<string>(chain.Airports); AddFlight(flight); }
private AirportChain(AirportChain chain, string arrival) { Airports = new List<string>(chain.Airports); Airports.Add(arrival); }