public async Task <(bool IsSuccess, double?CrossingTime, string ErrorMessage)> CrossBridgeAsync(Models.Hiker hiker, Models.Bridge bridge) { try { var timeToCross = await Task.Run(() => bridge.Span / hiker.CrossingSpeed); return(true, timeToCross, null); } catch (Exception ex) { logger?.LogError(ex.ToString()); return(false, null, ex.Message); } }
/// <summary> /// /// </summary> /// <param name="hikers"></param> /// <param name="bridge"></param> /// <returns></returns> public async Task <(bool IsSuccess, double?CrossingTime, SortedList <double, Models.Hiker> SortedHikers, string ErrorMessage)> CrossBridgeAsync(SortedList <double, Models.Hiker> hikers, Models.Bridge bridge) { try { if (hikers == null) { hikers = new SortedList <double, Models.Hiker>(); } foreach (var hiker in bridge.Hikers) { hikers.Add(hiker.CrossingSpeed, hiker); } if (!hikers.Any()) // no hikers at this bridge - nobody needs to cross; return zero minutes { return(true, 0, hikers, null); } else if (hikers.Count <= 2) // only one hiker at this bridge - return this hiker's crossing time // only two hiker at this bridge - return the slower hiker's crossing time { var oneOrTwoeHikerResult = await hikerProvider.CrossBridgeAsync(hikers.First().Value, bridge); return(true, oneOrTwoeHikerResult.CrossingTime, hikers, null); } else { var fastestHiker = hikers.Last().Value; int numberOfReturnTrips = hikers.Count - 2; var taskResult = await hikerProvider.CrossBridgeAsync(fastestHiker, bridge); var fastestHikerCrossTime = (taskResult.IsSuccess) ? taskResult.CrossingTime.Value : 0; double crossingTime = fastestHikerCrossTime * numberOfReturnTrips; for (int i = 0; i <= hikers.Count - 2; i++) { taskResult = await hikerProvider.CrossBridgeAsync(hikers[hikers.Keys[i]], bridge); crossingTime = (taskResult.IsSuccess) ? crossingTime + taskResult.CrossingTime.Value : crossingTime; } return(true, crossingTime, hikers, null); } } catch (Exception ex) { logger?.LogError(ex.ToString()); return(false, null, null, ex.Message); } }