private IEnumerable <Route> Compute(Request request) { var town = _towns.FirstOrDefault(a => a.Name == request.From); _queue.Enqueue(town, 0, Route.Empty); while (_queue.HasData) { _queue.Dequeue(); foreach (var neighbor in _queue.CurrentTown.Neighbors) { town = neighbor.Key; int distance = neighbor.Value; if ((_queue.CurrentRoute.Distance + distance) >= (request.DistanceLessThan ?? int.MaxValue)) { continue; } if (_queue.CurrentRoute.Stops > (request.MaxStop ?? int.MaxValue)) { continue; } if (town.Name == request.To) { if (request.AllowCircularRoute) { _queue.Enqueue(town, distance, _queue.CurrentRoute); } yield return(_queue.CurrentRoute.NewRouteTo(request.To, distance)); } else { if (_queue.CurrentRoute.TownHasVisited(town) && !request.AllowCircularRoute) { continue; } _queue.Enqueue(town, distance, _queue.CurrentRoute); } } } }