public void ModeCalculationTest() { int[] input = new int[] { 1, 2, 11, 11, 88, 99 }; var result = StatFunctions.CalculateModeValue(input); Assert.IsTrue(result[0] == 11); }
public bool Process(string outputFolder = null, string outputType = null) { foreach (var group in _Groups) { List <string> subjects = new List <string>(); foreach (var std in group.Students) { //calculate weighted average for each student in each group std.WeightedAverage = CalculateStudentWeightedAverage(std); //need to fill in list of subjects I assume that each group can have different subjects, //if at least one person have subject in group then subject is relevant for group foreach (var subject in std.Subjects) { if (!subjects.Contains(subject.Name)) { subjects.Add(subject.Name); } } } //now when I know all the subjects relevant for group, can start calculation foreach (var subj in subjects) { //get all values for this subject in group var values = group.Students.Select(p => p.Subjects.Where(x => x.Name == subj).DefaultIfEmpty(new Subject() { Name = subj, SucessRate = 0 }).First().SucessRate).ToArray(); SubjectResult result = new SubjectResult(); result.Name = subj; result.Average = StatFunctions.CalculateAverage(values); result.Median = StatFunctions.CalculateMedian(values); result.Modus = StatFunctions.CalculateModeValue(values); group.SubjectResults.Add(result); } } //now calculate overall results //first build of list of relevant subjects List <string> subjectsOverall = new List <string>(); foreach (var grp in _Groups) { foreach (var item in grp.SubjectResults) { if (!subjectsOverall.Contains(item.Name)) { subjectsOverall.Add(item.Name); } } } //now start calculation foreach (var subj in subjectsOverall) { List <int> totalvalues = new List <int>(); var valuesInGroups = _Groups.Select(u => u.Students.Select(p => p.Subjects.Where(x => x.Name == subj).DefaultIfEmpty(new Subject() { Name = subj, SucessRate = 0 }).First().SucessRate).ToList()); foreach (var item in valuesInGroups) { totalvalues.AddRange(item); } int[] totalValuesArray = totalvalues.ToArray(); SubjectResult newResult = new SubjectResult(); newResult.Name = subj; newResult.Average = StatFunctions.CalculateAverage(totalValuesArray); newResult.Median = StatFunctions.CalculateMedian(totalValuesArray); newResult.Modus = StatFunctions.CalculateModeValue(totalValuesArray); _TotalResults.Add(newResult); } //everything calculated at this point return(true); }