Пример #1
0
        public IActionResult SubmitQuestion(UserAnswerDto userAnswerDto, int id)
        {
            var question = _questionRepository.GetQuestionId(userAnswerDto.QuestionId);

            foreach (var answer in question.Answers)
            {
                if (answer.Correct && answer.Id == userAnswerDto.AnswerId)
                {
                    _teamRepository.IncrementTeam(userAnswerDto.TeamId);
                }
            }
            return(Ok(new MessageDto("Done")));
        }
Пример #2
0
        public async Task SaveResult(UserAnswerDto dto)
        {
            //save result
            Result result = new Result
            {
                ExamId       = dto.ExamId,
                UserId       = dto.UserId,
                Time         = dto.Time,
                TotalCorrect = dto.TotalCorrect,
                DateAt       = DateTime.Now
            };
            await _context.Results.AddAsync(result);

            await _context.SaveChangesAsync();

            //get old fail
            var failQuestions = await _context.FailQuestions.Where(s => s.UserId == dto.UserId).ToListAsync();

            var failQuestionIds = failQuestions.Select(s => s.QuestionId);
            //add new fail
            var newFails  = dto.Answers.Where(s => !s.IsRight).Select(s => s.QuestionId);
            var needToAdd = newFails.Except(failQuestionIds)
                            .Select(s => new FailQuestion
            {
                QuestionId = s,
                UserId     = dto.UserId,
                Times      = 1,
                Passed     = false
            });
            await _context.FailQuestions.AddRangeAsync(needToAdd);

            //update times fail
            var increaseTimesIds = failQuestionIds.Intersect(newFails);
            var increaseTimes    = failQuestions.Where(s => increaseTimesIds.Contains(s.Id)).Select(s => s);

            foreach (var old in increaseTimes)
            {
                old.Times += 1;
            }
            _context.FailQuestions.UpdateRange(increaseTimes);
            //update passed
            var newCorrects = dto.Answers.Where(s => s.IsRight).Select(s => s.QuestionId);
            var passed      = failQuestions.Where(s => newCorrects.Contains(s.QuestionId)).Select(s => s);

            foreach (var old in passed)
            {
                old.Passed = true;
            }
            _context.FailQuestions.UpdateRange(passed);
            await _context.SaveChangesAsync();
        }
Пример #3
0
        /// <summary>
        /// Выполняет проверку ответов пользователя
        /// </summary>
        /// <param name="sourceQuizBlock">Исходный блок теста.</param>
        /// <param name="answeredQuizBlock">Блок теста с ответом пользователя.</param>
        /// <returns>Значение, показывающее, правильно ли ответил пользователь.</returns>
        public static bool CheckQuizAnswer(QuizBlockDto sourceQuizBlock, UserAnswerDto answeredQuizBlock)
        {
            var userAnswerList  = answeredQuizBlock.UserAnswer.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
            var blockAnswerList = sourceQuizBlock.Answers.Where(e => e.IsCorrect).ToList();

            //// Если нет пользовательских ответов - ответ некорректный.
            if (!userAnswerList.Any())
            {
                return(false);
            }

            //// Проверим ответы.
            var allIsCorrect = true;

            foreach (var blockAnswer in blockAnswerList)
            {
                switch (blockAnswer.AnswerType)
                {
                case AnswerBlockType.Text:
                    var firstUserAnswer  = userAnswerList.First().Trim();
                    var firstBlockAnswer = blockAnswer.Text.Trim();
                    allIsCorrect &= firstBlockAnswer.Equals(firstUserAnswer, StringComparison.InvariantCultureIgnoreCase);
                    break;

                case AnswerBlockType.Checkbox:
                case AnswerBlockType.Radio:
                    allIsCorrect &= userAnswerList.Contains(blockAnswer.Id.ToString());
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(blockAnswer.AnswerType));
                }
            }

            return(allIsCorrect);
        }