public void CalcAndSetFinalAssessment() { //alternativeId, points ProjectAssessment result = new ProjectAssessment() { Items = new List <ProjectAssessmentItem>() }; foreach (var alternative in Alternatives) { var alternativeAssessments = Assessments .SelectMany(x => x.Items).Where(item => item.AlternativeId == alternative.AlternativeId) .ToDictionary(x => new { x.ExpertId, x.FactorId }, x => x.Points.Value).OrderBy(x => x.Key.ExpertId).ThenBy(x => x.Key.FactorId); List <decimal> levels = GetLevels(); Dictionary <decimal, decimal[]> levelPoints = new Dictionary <decimal, decimal[]>(); for (int i = 0; i < levels.Count; i++) { var level = levels[i]; levelPoints.Add(level, new decimal[Factors.Count]); for (int j = 0; j < Factors.Count; j++) { var factor = Factors[j]; List <decimal> expertPointsForDecision = new List <decimal>(); foreach (var expert in Experts) { expertPointsForDecision.Add(alternativeAssessments.Single(x => x.Key.ExpertId == expert.UserId && x.Key.FactorId == factor.FactorId).Value); } var aggregatedDecisionForLevel = expertPointsForDecision.Where(x => x >= level).Count(); levelPoints[level][j] = aggregatedDecisionForLevel; } } for (int i = 0; i < Factors.Count; i++) { result.Items.Add(new ProjectAssessmentItem() { AlternativeId = alternative.AlternativeId, FactorId = Factors[i].FactorId, Points = levelPoints.Select(x => x.Value[i] / Experts.Count).Average() }); } } this.FinalAssessment = result; }
public void CalcAndSetFinalAssessment() { //alternativeId, points ProjectAssessment result = new ProjectAssessment() { Items = new List<ProjectAssessmentItem>() }; foreach (var alternative in Alternatives) { var alternativeAssessments = Assessments .SelectMany(x => x.Items).Where(item => item.AlternativeId == alternative.AlternativeId) .ToDictionary(x => new { x.ExpertId, x.FactorId }, x => x.Points.Value).OrderBy(x => x.Key.ExpertId).ThenBy(x => x.Key.FactorId); List<decimal> levels = GetLevels(); Dictionary<decimal, decimal[]> levelPoints = new Dictionary<decimal, decimal[]>(); for (int i = 0; i < levels.Count; i++) { var level = levels[i]; levelPoints.Add(level, new decimal[Factors.Count]); for (int j = 0; j < Factors.Count; j++) { var factor = Factors[j]; List<decimal> expertPointsForDecision = new List<decimal>(); foreach (var expert in Experts) { expertPointsForDecision.Add(alternativeAssessments.Single(x => x.Key.ExpertId == expert.UserId && x.Key.FactorId == factor.FactorId).Value); } var aggregatedDecisionForLevel = expertPointsForDecision.Where(x => x >= level).Count(); levelPoints[level][j] = aggregatedDecisionForLevel; } } for (int i = 0; i < Factors.Count; i++) { result.Items.Add(new ProjectAssessmentItem() { AlternativeId = alternative.AlternativeId, FactorId = Factors[i].FactorId, Points = levelPoints.Select(x => x.Value[i] / Experts.Count).Average() }); } } this.FinalAssessment = result; }