public ElevatorModel TakeClosestElevator(int floor) { if (!routeValidationService.IsFloorNumberCorrect(floor)) { throw new ArgumentOutOfRangeException(nameof(floor)); } lock (locker) { var orderedElevators = freeElevators .OrderBy(p => Math.Abs(p.Value.CurrentFloor - floor)); if (!orderedElevators.Any()) { return(null); } var closestElevatorEntry = orderedElevators.First(); freeElevators.TryRemove(closestElevatorEntry.Key, out var closestElevator); occupiedElevators.TryAdd(closestElevatorEntry.Key, closestElevator); elevatorEventLogService.LogEvent(closestElevator, "Called elevator"); return(closestElevator); } }
public Task GoToFloorAsync(ElevatorModel elevator, int targetFloor) { if (elevator == null) { throw new ArgumentNullException(nameof(elevator)); } if (!routeValidationService.IsFloorNumberCorrect(targetFloor)) { throw new ArgumentOutOfRangeException(nameof(targetFloor)); } return(GoToFloorInternalAsync(elevator, targetFloor)); }