Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        /// <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);
            }
        }