/// <summary> /// Обновляет топ-5 самых используемых карт /// </summary> /// <param name="info">Информация о матче</param> /// <param name="stats">Статистика сервера</param> /// <returns>Новый список топ-5</returns> private List <string> GetTop5Maps(MatchInfo info, ServerStats stats) { return(Top5Maps.ToList().UpdateTop(5, m => stats.MapFrequency[m], m => m, info.Map).ToList()); }
/// <summary> /// Обновляет топ-5 самых используемых игровых режимов /// </summary> /// <param name="info">Информация о матче</param> /// <param name="stats">Статистика сервера</param> /// <returns>Новый список топ-5</returns> private List <string> GetTop5Modes(MatchInfo info, ServerStats stats) { return(Top5GameModes.ToList().UpdateTop(5, m => stats.GameModeFrequency[m], m => m, info.GameMode).ToList()); }
/// <summary> /// Вычисляет новое значение статистики, основываясь на старой статистике и новых данных /// </summary> /// <param name="info">Информация о матче</param> /// <param name="stats">Приватная статистика сервера</param> /// <returns> /// Новый экземпляр данного класса с обновлённой статистикой, /// старый экземпляр не меняется из-за необходимости блокировок в многопоточной среде /// </returns> public PublicServerStats CalcNew(MatchInfo info, ServerStats stats) { return(new PublicServerStats { TotalMatchesPlayed = TotalMatchesPlayed + 1, Top5Maps = GetTop5Maps(info, stats), Top5GameModes = GetTop5Modes(info, stats), MaximumMatchesPerDay = Math.Max(MaximumMatchesPerDay, stats.MatchesInLastDay), AverageMatchesPerDay = (double)(TotalMatchesPlayed + 1) / stats.DaysWithMatches, MaximumPopulation = Math.Max(MaximumPopulation, info.Scoreboard.Count), AveragePopulation = (double)stats.TotalPopulation / (TotalMatchesPlayed + 1) }); }