private void CalculateResults() { foreach (var answer in Answers) { ResultItem resultItem; var correctAnswers = answer.Key.Variants.OrderBy(ans => ans.Id) .Where(ans => ans.IsRight) .Select(ans => ans.Id) .ToList(); var answers = answer.Value.Where(mod => mod.CheckState) .OrderBy(mod => mod.VariantId) .Select(mod => mod.VariantId) .ToList(); var equalityResult = correctAnswers.SequenceEqual(answers); if (this.ResultConfig.FullAnswer) { resultItem = equalityResult ? new ResultItem { CountOfRightAnswers = answers.Count, CountOfWrongAnswers = 0, IsRight = true, Koefficient = 1 } : this.GetResultItem(answers, correctAnswers, answers.Count > correctAnswers.Count); } else { if (equalityResult) { resultItem = new ResultItem { CountOfRightAnswers = answers.Count, CountOfWrongAnswers = 0, IsRight = true, Koefficient = 1 }; } else { resultItem = this.GetResultItem(answers, correctAnswers, answers.Count > correctAnswers.Count); resultItem.IsRight = false; resultItem.Koefficient = 0; } } this.Results.Add(resultItem); } }
private ResultItem GetResultItem(ICollection<int> answers, ICollection<int> correctAnswers, bool answersGreater) { var resultItem = new ResultItem(); foreach (var checkCorrectness in answers.Select(correctAnswers.Contains)) { if (checkCorrectness) { resultItem.CountOfRightAnswers++; } else { resultItem.CountOfWrongAnswers++; } } if (answersGreater) { resultItem.CountOfWrongAnswers = resultItem.CountOfWrongAnswers + (correctAnswers.Count - answers.Count); } if (this.ResultConfig.IgnoreWrongAnswers) { resultItem.Koefficient = resultItem.CountOfRightAnswers / correctAnswers.Count; } else { resultItem.Koefficient = (resultItem.CountOfRightAnswers - resultItem.CountOfWrongAnswers) / correctAnswers.Count; } resultItem.IsRight = resultItem.Koefficient > 0; return resultItem; }