public void Generate(SchoolScores schoolScores, string outputFileName) { using (var sw = new StreamWriter(outputFileName, true)) { sw.WriteLine("----- School level data ----"); sw.WriteLine(); sw.WriteLine("---------------------------"); sw.WriteLine("Highest performing class considering averages only: {0}", schoolScores.HighestPerformingClass); sw.WriteLine("(new) Highest performing student across all classes: {0}", schoolScores.HighestPerformingStudent.Name); sw.WriteLine("---------------------------"); sw.WriteLine("Students Average across all classes: {0}", schoolScores.SchoolAverage); sw.WriteLine("// In V2 school level median and percentile will be available."); sw.WriteLine(); sw.WriteLine("----- Class level data ----"); foreach (var classScores in schoolScores.ClassScores) { sw.WriteLine(); sw.WriteLine("Class Name: {0}", classScores.ClassName); sw.WriteLine("Class Average: {0}", classScores.ClassAverage); sw.WriteLine("(new) Class Median: {0}", classScores.ClassMedian); sw.WriteLine("(new) Class top student: {0}", classScores.TopStudent.Name); sw.WriteLine("Total students: {0}", classScores.TotalStudents); sw.WriteLine("Total students considered for average: {0}", classScores.TotalStudentsForAverageCalc); sw.WriteLine("Ignored students: {0}", string.Join(", ", classScores.IgnoredStudents.Select(x => x.Name))); sw.WriteLine(); sw.WriteLine(); } } }
public SchoolScores CalcuateScores(IList <SchoolClass> schoolClasses) { var schoolScores = new SchoolScores(); foreach (var schoolClass in schoolClasses) { var classScores = new ClassScores(); classScores.ClassName = schoolClass.ClassName; var totalStudents = schoolClass.Students.Count(); var scores = 0; Student topStudent = null; foreach (var student in schoolClass.Students) { if (student.Grade == 0) { classScores.IgnoredStudents.Add(student); totalStudents--; } else { if (topStudent == null || topStudent.Grade < student.Grade) { topStudent = student; } scores += (int)student.Grade; } } float classAverage = (float)scores / totalStudents; classScores.ClassAverage = MathF.Round(classAverage, 1); classScores.ClassMedian = CalcuateMedian(schoolClass.Students); classScores.TopStudent = topStudent; classScores.TotalStudentsForAverageCalc = totalStudents; classScores.TotalStudents = schoolClass.Students.Count(); schoolScores.ClassScores.Add(classScores); } string topClass = null; float topClassAverage = 0; Student topSchoolStudent = null; float classAverages = 0; foreach (var classScore in schoolScores.ClassScores) { classAverages += classScore.ClassAverage; if (topClassAverage < classScore.ClassAverage) { topClassAverage = classScore.ClassAverage; topClass = classScore.ClassName; } if (topSchoolStudent == null || topSchoolStudent.Grade < classScore.TopStudent.Grade) { topSchoolStudent = classScore.TopStudent; } } schoolScores.HighestPerformingClass = topClass; schoolScores.HighestPerformingStudent = topSchoolStudent; schoolScores.SchoolAverage = MathF.Round(classAverages / schoolScores.ClassScores.Count(), 1); return(schoolScores); }