private async Task<float> GetAverageForType(ApplicationUser student, IEnumerable<WorkItem> workItems, WorkItemType type, GradeDistribution distribution) { var scoreUnitManager = new ScoreUnitManager(_db); var workItemsForType = workItems.Where(wi => wi.Type == type); var PointsForType = MaxPointsForType(type, distribution); // If no WorkItem for the type, return total for that type if(workItemsForType.Count() == 0) { return PointsForType; } bool hasGradedScoreUnit = false; float studentsScores = 0.0f; float total = 0.0f; foreach(var workItem in workItemsForType) { var scoreUnit = await scoreUnitManager.GetStudentScoreUnit(workItem, student); if(scoreUnit != null && scoreUnit.Grade.HasValue) { hasGradedScoreUnit = true; studentsScores += scoreUnit.Grade.Value; total += workItem.MaxPoints; } } // If no ScoreUnit has been graded, return the total for that type if(!hasGradedScoreUnit) { return PointsForType; } return (studentsScores / total) * PointsForType; }
private float MaxPointsForType(WorkItemType type, GradeDistribution distribution) { switch(type) { case WorkItemType.Exam: return distribution.Exam; case WorkItemType.Project: return distribution.Project; case WorkItemType.Homework: return distribution.Homework; case WorkItemType.Quiz: return distribution.Quiz; case WorkItemType.Other: return distribution.Other; default: return 0; } }