示例#1
0
        private async Task <List <Result> > GetResults(Models.Crew crew)
        {
            List <Models.Crew> allCrews = await _context.Crews.Include(c => c.Results)
                                          .Include("Results.TimingPoint").ToListAsync();

            Models.Result previousResult = null;
            bool          isFirst        = true;

            Models.TimingPoint startPoint = crew.Competition.TimingPoints.First();

            List <Result> results = new List <Result>();

            foreach (Models.Result result in crew.Results.OrderBy(x => x.TimingPoint.Order))
            {
                results.Add(new Result()
                {
                    Id          = result.TimingPointId,
                    Name        = result.TimingPoint.Name,
                    TimeOfDay   = result.TimeOfDay,
                    SectionTime = isFirst ? null : crew.RunTime(previousResult.TimingPoint, result.TimingPoint),
                    RunTime     = isFirst ? null : crew.RunTime(startPoint, result.TimingPoint),
                    Rank        = isFirst ? String.Empty : crew.Rank(allCrews.Where(x => x.RunTime(startPoint, result.TimingPoint).HasValue)
                                                                     .OrderBy(x => x.RunTime(startPoint, result.TimingPoint)).ToList(),
                                                                     startPoint, result.TimingPoint)
                });
                previousResult = result;
                isFirst        = false;
            }
            return(results);
        }
示例#2
0
        public async Task <IActionResult> GetById(int id)
        {
            Models.Crew crew = await _context.Crews.Include(x => x.Results).FirstOrDefaultAsync(x => x.BroeCrewId == id);

            if (crew == null)
            {
                return(NotFound());
            }

            Models.Competition comp = await _context.Competitions.Include(c => c.TimingPoints)
                                      .FirstOrDefaultAsync(c => c.CompetitionId == crew.CompetitionId);

            Crew output = ResultsHelper.BuildCrew(_mapper, comp, crew);

            if (comp.TimingPoints.Count > 0)
            {
                Models.TimingPoint lastPoint = comp.TimingPoints.Last();
                List <Models.Crew> crews     = ResultsHelper.OrderCrews(comp.Crews, comp, lastPoint);
                output.Rank = crew.Rank(crews, comp.TimingPoints.First(), lastPoint);
            }
            for (int i = 1; i < crew.Results.Count; i++)
            {
                List <Models.Crew> crews = ResultsHelper.OrderCrews(comp.Crews, comp, comp.TimingPoints[i]);
                output.Results[i].Rank = crew.Rank(crews, comp.TimingPoints.First(), comp.TimingPoints[i]);
            }
            return(Ok(output));
        }
        public static List <Models.Crew> OrderCrews(List <Models.Crew> crews, Models.Competition competition, Models.TimingPoint timingPoint)
        {
            if (crews is null)
            {
                throw new ArgumentNullException(nameof(crews));
            }

            if (competition is null)
            {
                throw new ArgumentNullException(nameof(competition));
            }

            if (timingPoint is null)
            {
                throw new ArgumentNullException(nameof(timingPoint));
            }

            int         timingPointIndex = competition.TimingPoints.IndexOf(timingPoint);
            int         timingPointId    = competition.TimingPoints[timingPointIndex].TimingPointId;
            TimingPoint startPoint       = competition.TimingPoints.First();

            var ordered = crews.OrderByDescending(x => (x.IsStarted) ? (x.IsTimeOnly ? 1 : 2) : 0);

            for (int i = timingPointIndex; i > 0; i--)
            {
                ordered = ordered.ThenByDescending(x => x.Results.FirstOrDefault(y => y.TimingPointId == timingPointId) != null)
                          .ThenBy(x => x.RunTime(startPoint, timingPoint));
            }

            return(ordered.ToList());
        }