private async Task <IReadOnlyList <TaskItem> > GetRandomTaskItemsAsync(
            EnglishLevel englishLevel,
            string grammarPart,
            TaskType taskType,
            int count)
        {
            var englishLevels = new List <EnglishLevel>()
            {
                englishLevel
            };

            if (englishLevel == EnglishLevel.Intermediate)
            {
                englishLevels.Add(EnglishLevel.PreIntermediate);
                englishLevels.Add(EnglishLevel.Elementary);
            }

            var taskItems = await _taskItemRepository
                            .FindAllAsync(x =>
                                          x.GrammarPart == grammarPart &&
                                          x.TaskType == taskType);

            taskItems = taskItems
                        .Where(x => englishLevels.Contains(x.EnglishLevel))
                        .ToList();

            var randomItems = taskItems
                              .GetRandomCountOfElements(count)
                              .ToList();

            return(randomItems);
        }
예제 #2
0
        public static EnglishLevel[] GetSortedEnglishLevelsByNearest(EnglishLevel englishLevel)
        {
            var englishLevels = Enum
                                .GetValues(typeof(EnglishLevel))
                                .Cast <int>()
                                .ToList();

            englishLevels.Sort();
            var englishLevelsCount = englishLevels.Count;

            var sortedEnglishLevels = new EnglishLevel[englishLevelsCount - 1];
            var leftLevel           = (int)englishLevel - 1;
            var rightLevel          = (int)englishLevel + 1;
            int index = 0;

            while (leftLevel >= 0 || rightLevel < englishLevelsCount)
            {
                if (leftLevel >= 0)
                {
                    sortedEnglishLevels[index] = (EnglishLevel)leftLevel;
                    index++;
                    leftLevel--;
                }

                if (rightLevel < englishLevelsCount)
                {
                    sortedEnglishLevels[index] = (EnglishLevel)rightLevel;
                    index++;
                    rightLevel++;
                }
            }

            return(sortedEnglishLevels);
        }
예제 #3
0
        private BaseFilterModel GetFilterWithTheNearestEnglishLevel(int neededCount, EnglishLevel userEnglishLevel)
        {
            var grammarParts  = new List <string>();
            var englishLevels = new List <EnglishLevel>();
            var totalCount    = 0;

            englishLevels.Add(userEnglishLevel);
            grammarParts.AddRange(TasksInformationModels[userEnglishLevel].GrammarPartCount.Keys);
            totalCount += TasksInformationModels[userEnglishLevel].GrammarPartCount.Values.Sum();

            var sortedEnglishLevelsByNearerToUser = EnglishLevelUtils.GetSortedEnglishLevelsByNearest(userEnglishLevel);

            foreach (var englishLevel in sortedEnglishLevelsByNearerToUser)
            {
                if (TasksInformationModels.TryGetValue(englishLevel, out var levelInformation))
                {
                    englishLevels.Add(englishLevel);
                    grammarParts.AddRange(TasksInformationModels[englishLevel].GrammarPartCount.Keys);
                    totalCount += TasksInformationModels[englishLevel].GrammarPartCount.Values.Sum();
                    if (totalCount >= neededCount)
                    {
                        break;
                    }
                }
            }

            var baseFilterModel = new BaseFilterModel();

            baseFilterModel.EnglishLevel = englishLevels;
            baseFilterModel.GrammarPart  = grammarParts;
            return(baseFilterModel);
        }
예제 #4
0
        public UserStatisticByQuizView GetUserStatistic(UserStatistic userStatistic, EnglishLevel englishLevel)
        {
            var userStatisticView = new UserStatisticByQuizView()
            {
                ScoreForQuiz        = decimal.Round(userStatistic.CorrectPercent * 100),
                TimeToSolved        = new TimeSpan(1, 14, 18).ToString(),
                EnglishLevel        = englishLevel,
                QuizResultChartView = new QuizResultChartView
                {
                    CorrectAnswers = userStatistic.CorrectAnswersCount,
                    FaliedAnswers  = userStatistic.FailedAnswersCount,
                    TotalAnswers   = userStatistic.QuestionsCount
                }
            };

            return(userStatisticView);
        }
예제 #5
0
        public UserStatisticView GetUserStatistics(IEnumerable <UserStatistic> userStatistics, EnglishLevel englishLevel)
        {
            if (userStatistics == null || !userStatistics.Any())
            {
                return(new UserStatisticView()
                {
                    EnglishLevel = EnglishLevel.Beginner
                });
            }
            var userStatisticView = new UserStatisticView()
            {
                TotalPassedQuizzes  = userStatistics.Select(x => x.QuizId).Distinct().Count(),
                ScoreForQuizzes     = decimal.Round((userStatistics.Sum(x => x.CorrectPercent) / userStatistics.Count()) * 100),
                EnglishLevel        = englishLevel,
                LastScoresChartView = new LastScoresChartView
                {
                    QuizScores = userStatistics.Take(5).Select(x => new QuizScoreView {
                        Title = x.QuizTitle, Score = x.CorrectPercent
                    })
                },
                QuizResultChartView = new QuizResultChartView
                {
                    CorrectAnswers = userStatistics.Sum(x => x.CorrectAnswersCount),
                    FaliedAnswers  = userStatistics.Sum(x => x.FailedAnswersCount),
                    TotalAnswers   = userStatistics.Sum(x => x.QuestionsCount)
                },
                PassedPercent        = decimal.Round((userStatistics.Sum(x => x.CorrectAnswersCount) / userStatistics.Sum(x => x.FailedAnswersCount)) * 100),
                TotalPassedQuestions = userStatistics.Sum(x => x.CorrectAnswersCount),
                TotalFailedQuestions = userStatistics.Sum(x => x.FailedAnswersCount),
            };

            return(userStatisticView);
        }