From 0fc00b5445b31d8fc94512afc64004e6df71bc87 Mon Sep 17 00:00:00 2001 From: user Date: Sat, 29 Jul 2023 14:29:05 +0200 Subject: [PATCH] SortedDictionary --- .../Objects/Json/DateFound.cs | 4 +- .../Specific/BySchoolYearCourseJson.cs | 32 ++++++------- .../Json/Indexes/Specific/BySchoolYearJson.cs | 6 +-- .../Json/Indexes/Specific/ByYearSchoolJson.cs | 6 +-- .../Objects/Json/Stats/StatsJson.cs | 2 +- .../Objects/Json/Stats/StatsYear.cs | 2 +- .../Objects/RankingNS/RankingSummary.cs | 9 ++-- .../Objects/StudentResult.cs | 4 +- .../Objects/Table.cs | 4 +- .../Objects/Tables/Course/CourseTableRow.cs | 4 +- .../Objects/Tables/Course/CourseTableStats.cs | 14 +++--- .../Objects/Tables/Merit/MeritTableRow.cs | 2 +- .../Utils/Output/HashMatricoleWrite.cs | 46 ++++++++++--------- .../Utils/Transformer/ParserNS/Parser.cs | 8 ++-- 14 files changed, 74 insertions(+), 69 deletions(-) diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Json/DateFound.cs b/PoliNetwork.Graduatorie.Parser/Objects/Json/DateFound.cs index 8959aebf..e12a861f 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Json/DateFound.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Json/DateFound.cs @@ -14,7 +14,7 @@ namespace PoliNetwork.Graduatorie.Parser.Objects.Json; public class DateFound { public const string PathFileName = "dateFound.json"; - public Dictionary? FirstDate; + public SortedDictionary? FirstDate; public void WriteToFile(string dataFolder) { @@ -33,7 +33,7 @@ public void UpdateDateFound(Ranking variable) { var path = variable.GetPath().Trim(); - FirstDate ??= new Dictionary(); + FirstDate ??= new SortedDictionary(); var dateTime = new DateTime(variable.Year ?? DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day); if (FirstDate.TryGetValue(path, out var oldValue)) diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/BySchoolYearCourseJson.cs b/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/BySchoolYearCourseJson.cs index d865e1e9..c449a007 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/BySchoolYearCourseJson.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/BySchoolYearCourseJson.cs @@ -19,9 +19,9 @@ public class BySchoolYearCourseJson : IndexJsonBase internal const string PathCustom = "bySchoolYearCourse.json"; //keys: school, year, course, location - public Dictionary< + public SortedDictionary< SchoolEnum, - Dictionary>>> + SortedDictionary>>> > Schools = new(); public static BySchoolYearCourseJson? From(RankingsSet? set) @@ -48,13 +48,13 @@ public Dictionary< return mainJson; } - private static Dictionary< + private static SortedDictionary< int, - Dictionary>> + SortedDictionary>> > GetYearsDict(IEnumerable> byYears) { var d = - new Dictionary>>>(); + new SortedDictionary>>>(); foreach (var yearGroup in byYears) GetYearsDictSingle(yearGroup, d); @@ -62,16 +62,16 @@ private static Dictionary< } private static void GetYearsDictSingle(IGrouping yearGroup, - IDictionary>>> d) + SortedDictionary>>> d) { if (yearGroup.Key != null) d.Add(yearGroup.Key.Value, GetCoursesDict(yearGroup)); } - private static Dictionary>> GetCoursesDict( + private static SortedDictionary>> GetCoursesDict( IEnumerable yearGroup ) { - var d = new Dictionary>>(); + var d = new SortedDictionary>>(); foreach (var ranking in yearGroup) { @@ -87,7 +87,7 @@ IEnumerable yearGroup } private static void AddCourseToDict( - IDictionary>> d, + SortedDictionary>> d, Ranking ranking, IGrouping courseGroup ) @@ -97,7 +97,7 @@ private static void AddCourseToDict( return; if (!d.ContainsKey(title)) - d[title] = new Dictionary>(); + d[title] = new SortedDictionary>(); var courseDict = d[title]; foreach (var course in courseGroup) @@ -195,11 +195,11 @@ private static List RankingsAdd(BySchoolYearCourseJson mainJson, string } private static void RankingsAddSingleYearSchool( - KeyValuePair>>> year, + KeyValuePair>>> year, string outFolder, KeyValuePair< SchoolEnum, - Dictionary>>> + SortedDictionary>>> > school, ICollection rankings ) @@ -222,9 +222,9 @@ Action Selector(KeyValuePair> variable) private static void RankingAdd( KeyValuePair< SchoolEnum, - Dictionary>>> + SortedDictionary>>> > school, - KeyValuePair>>> year, + KeyValuePair>>> year, string outFolder, KeyValuePair> filename, ICollection rankings @@ -237,9 +237,9 @@ ICollection rankings private static void RankingAddSingle( KeyValuePair< SchoolEnum, - Dictionary>>> + SortedDictionary>>> > school, - KeyValuePair>>> year, + KeyValuePair>>> year, string outFolder, ICollection rankings, SingleCourseJson variable diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/BySchoolYearJson.cs b/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/BySchoolYearJson.cs index c05b9c03..265496a0 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/BySchoolYearJson.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/BySchoolYearJson.cs @@ -16,7 +16,7 @@ public class BySchoolYearJson : IndexJsonBase { internal const string PathCustom = "bySchoolYear.json"; - public Dictionary>> Schools = new(); + public SortedDictionary>> Schools = new(); public static BySchoolYearJson? From(RankingsSet? set) { @@ -32,7 +32,7 @@ public class BySchoolYearJson : IndexJsonBase continue; var school = schoolGroup.Key.Value; - var schoolDict = new Dictionary>(); + var schoolDict = new SortedDictionary>(); var byYears = schoolGroup.GroupBy(r => r.Year); foreach (var yearGroup in byYears) @@ -50,7 +50,7 @@ public class BySchoolYearJson : IndexJsonBase private static void AddSchool( IGrouping yearGroup, - IDictionary> schoolDict + SortedDictionary> schoolDict ) { var yearGroupKey = yearGroup.Key; diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/ByYearSchoolJson.cs b/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/ByYearSchoolJson.cs index cec82cf1..c5bfb610 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/ByYearSchoolJson.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Json/Indexes/Specific/ByYearSchoolJson.cs @@ -16,7 +16,7 @@ public class ByYearSchoolJson : IndexJsonBase { internal const string PathCustom = "byYearSchool.json"; - public Dictionary>> Years = new(); + public SortedDictionary>> Years = new(); public static ByYearSchoolJson? From(RankingsSet? set) { @@ -32,7 +32,7 @@ public class ByYearSchoolJson : IndexJsonBase continue; var year = yearGroup.Key.Value; - var yearDict = new Dictionary>(); + var yearDict = new SortedDictionary>(); var bySchools = yearGroup.GroupBy(r => r.School); foreach (var schoolGroup in bySchools) @@ -87,7 +87,7 @@ private static List RankingsAdd(ByYearSchoolJson mainJson, string outFo } private static void RankingAdd( - KeyValuePair>> year, + KeyValuePair>> year, KeyValuePair> school, string outFolder, SingleCourseJson filename, diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Json/Stats/StatsJson.cs b/PoliNetwork.Graduatorie.Parser/Objects/Json/Stats/StatsJson.cs index f1515cb6..f3c394c0 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Json/Stats/StatsJson.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Json/Stats/StatsJson.cs @@ -17,7 +17,7 @@ public class StatsJson private const string PathStats = "stats"; public DateTime LastUpdate = DateTime.UtcNow; - public Dictionary Stats = new(); + public SortedDictionary Stats = new(); public static void Write(string outFolder, RankingsSet? rankingsSet, ArgsConfig argsConfig) { diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Json/Stats/StatsYear.cs b/PoliNetwork.Graduatorie.Parser/Objects/Json/Stats/StatsYear.cs index ae6fe891..a31c7f11 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Json/Stats/StatsYear.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Json/Stats/StatsYear.cs @@ -13,7 +13,7 @@ namespace PoliNetwork.Graduatorie.Parser.Objects.Json.Stats; public class StatsYear { public int? NumStudents; - public Dictionary Schools = new(); + public SortedDictionary Schools = new(); public int GetHashWithoutLastUpdate() { diff --git a/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/RankingSummary.cs b/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/RankingSummary.cs index 4e7fa633..e36e7107 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/RankingSummary.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/RankingNS/RankingSummary.cs @@ -15,7 +15,7 @@ public class RankingSummary public List? CourseSummarized; public int? HowManyCanEnroll; public int? HowManyStudents; - public Dictionary? ResultsSummarized; //key=score, value=howManyGotThatScore + public SortedDictionary? ResultsSummarized; //key=score, value=howManyGotThatScore public int GetHashWithoutLastUpdate() { @@ -61,11 +61,12 @@ public static RankingSummary From(Ranking ranking) distinctBy ?.ToList(); var tableStatsList2 = Get(tableStatsList); + var resultsSummarized = new SortedDictionary(keyValuePairs ?? new Dictionary()); return new RankingSummary { HowManyCanEnroll = howManyCanEnroll, HowManyStudents = byMeritRows?.Count, - ResultsSummarized = keyValuePairs, + ResultsSummarized = resultsSummarized, CourseSummarized = tableStatsList2 }; } @@ -82,11 +83,11 @@ private static List Get( } - private static Dictionary? CalculateResultsScores(IReadOnlyCollection? byMeritRows) + private static SortedDictionary? CalculateResultsScores(IReadOnlyCollection? byMeritRows) { if (byMeritRows == null) return null; - var results = new Dictionary(); + var results = new SortedDictionary(); var enumerable = byMeritRows.Select(Round); foreach (var score in enumerable) { diff --git a/PoliNetwork.Graduatorie.Parser/Objects/StudentResult.cs b/PoliNetwork.Graduatorie.Parser/Objects/StudentResult.cs index d271be8a..cb013bc4 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/StudentResult.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/StudentResult.cs @@ -16,11 +16,11 @@ public class StudentResult public string? CanEnrollInto; public int? EnglishCorrectAnswers; public string? Id; - public Dictionary? Ofa; // maybe change it + public SortedDictionary? Ofa; // maybe change it public int? PositionAbsolute; public int? PositionCourse; public decimal? Result; - public Dictionary? SectionsResults; + public SortedDictionary? SectionsResults; public int GetHashWithoutLastUpdate() { diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Table.cs b/PoliNetwork.Graduatorie.Parser/Objects/Table.cs index 81435cc6..2ca419f0 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Table.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Table.cs @@ -43,10 +43,10 @@ public static Table Create(List headers, List? sections, List return string.IsNullOrEmpty(fieldByIndex) ? null : fieldByIndex; } - public Dictionary? GetSectionsIndex() + public SortedDictionary? GetSectionsIndex() { if (Sections is null) return null; - var dict = new Dictionary(); + var dict = new SortedDictionary(); foreach (var section in Sections) { var index = Headers.FindIndex(h => h == section); diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTableRow.cs b/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTableRow.cs index cd0cdc95..b7eccee1 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTableRow.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTableRow.cs @@ -15,8 +15,8 @@ public class CourseTableRow public bool? CanEnroll; public int? EnglishCorrectAnswers; public string? Id; - public Dictionary? Ofa; // maybe change it + public SortedDictionary? Ofa; // maybe change it public int? Position; public decimal? Result; - public Dictionary? SectionsResults; + public SortedDictionary? SectionsResults; } \ No newline at end of file diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTableStats.cs b/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTableStats.cs index 39ebe81f..82e0c357 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTableStats.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Tables/Course/CourseTableStats.cs @@ -15,10 +15,10 @@ public class CourseTableStats public double? AverageBirthYear; public double? AverageEnglishCorrectAnswers; public decimal? AverageOfWhoPassed; - public Dictionary? AveragePartialScores; + public SortedDictionary? AveragePartialScores; public decimal? AverageScoresOfAllStudents; public int? HowManyCanEnroll; - public Dictionary? HowManyOfa; + public SortedDictionary? HowManyOfa; public int? HowManyStudents; public string? Location; public decimal? MinScoreToEnroll; @@ -145,14 +145,14 @@ public static CourseTableStats From(CourseTable courseTable) return average == null ? null : Math.Round(average.Value, Decimals); } - private static Dictionary? HowManyOfaCalculate( + private static SortedDictionary? HowManyOfaCalculate( IReadOnlyCollection courseTableRows ) { if (courseTableRows.Count == 0) return null; - var result = new Dictionary(); + var result = new SortedDictionary(); var keys = courseTableRows.Select(x => x.Ofa?.Keys); var distinctKeys = DistinctKeys(keys); @@ -166,14 +166,14 @@ IReadOnlyCollection courseTableRows return result; } - private static Dictionary? AveragePartialScoresCalculate( + private static SortedDictionary? AveragePartialScoresCalculate( IReadOnlyCollection courseTableRows ) { if (courseTableRows.Count == 0) return null; - var scores = new Dictionary(); + var scores = new SortedDictionary(); var keys = courseTableRows.Select(x => x.SectionsResults?.Keys).ToList(); var keysDistinct = DistinctKeys(keys); @@ -194,7 +194,7 @@ IReadOnlyCollection courseTableRows private static HashSet DistinctKeys( - IEnumerable.KeyCollection?>? keysList + IEnumerable.KeyCollection?>? keysList ) { var result = new HashSet(); diff --git a/PoliNetwork.Graduatorie.Parser/Objects/Tables/Merit/MeritTableRow.cs b/PoliNetwork.Graduatorie.Parser/Objects/Tables/Merit/MeritTableRow.cs index a6792c7c..ee034c65 100644 --- a/PoliNetwork.Graduatorie.Parser/Objects/Tables/Merit/MeritTableRow.cs +++ b/PoliNetwork.Graduatorie.Parser/Objects/Tables/Merit/MeritTableRow.cs @@ -14,7 +14,7 @@ public class MeritTableRow public bool? CanEnroll; public string? CanEnrollInto; public string? Id; - public Dictionary? Ofa; // maybe change it + public SortedDictionary? Ofa; // maybe change it public int? Position; public decimal? Result; } \ No newline at end of file diff --git a/PoliNetwork.Graduatorie.Parser/Utils/Output/HashMatricoleWrite.cs b/PoliNetwork.Graduatorie.Parser/Utils/Output/HashMatricoleWrite.cs index 66db93a7..e2154f49 100644 --- a/PoliNetwork.Graduatorie.Parser/Utils/Output/HashMatricoleWrite.cs +++ b/PoliNetwork.Graduatorie.Parser/Utils/Output/HashMatricoleWrite.cs @@ -21,9 +21,9 @@ public static void Write(RankingsSet? rankingsSet, string outFolder) WriteToFile(dictionary, outFolder); } - private static Dictionary GetDictToWrite(RankingsSet rankingsSet) + private static SortedDictionary GetDictToWrite(RankingsSet rankingsSet) { - var dictionary = new Dictionary(); + var dictionary = new SortedDictionary(); foreach (var ranking in rankingsSet.Rankings) { var byMeritRows = ranking.ByMerit?.Rows; @@ -33,46 +33,50 @@ private static Dictionary GetDictToWrite(RankingsSet AddToDict(dictionary, ranking, student, null); var rankingByCourse = ranking.ByCourse; - if (rankingByCourse != null) - foreach (var courseTable in rankingByCourse) - { - var row = courseTable.Rows; - if (row != null) - foreach (var studentResult in row) - if (!string.IsNullOrEmpty(studentResult.Id)) - AddToDict(dictionary, ranking, studentResult, courseTable); - } + if (rankingByCourse == null) continue; + foreach (var courseTable in rankingByCourse) + { + var row = courseTable.Rows; + if (row == null) continue; + foreach (var studentResult in row) + if (!string.IsNullOrEmpty(studentResult.Id)) + AddToDict(dictionary, ranking, studentResult, courseTable); + } } return dictionary; } - private static void WriteToFile(Dictionary dictionary, string outFolder) + private static void WriteToFile(SortedDictionary dictionary, string outFolder) { Console.WriteLine($"[INFO] Students with id are {dictionary.Keys.Count}"); var dictResult = - new Dictionary>(); + new SortedDictionary>(); foreach (var variable in dictionary) { var key = variable.Key[..2]; if (!dictResult.ContainsKey(key)) - dictResult[key] = new Dictionary(); + dictResult[key] = new SortedDictionary(); if (!dictResult[key].ContainsKey(variable.Key)) dictResult[key][variable.Key] = variable.Value; } - var hashmatricole = outFolder + "/hashMatricole"; - if (!Directory.Exists(hashmatricole)) Directory.CreateDirectory(hashmatricole); + var hashMatricole = outFolder + "/hashMatricole"; + if (!Directory.Exists(hashMatricole)) Directory.CreateDirectory(hashMatricole); - foreach (var variable in dictResult) - { - var toWrite = JsonConvert.SerializeObject(variable.Value, Culture.JsonSerializerSettings); - File.WriteAllText(hashmatricole + "/" + variable.Key + ".json", toWrite); - } + foreach (var variable in dictResult) WriteSingleHashFile(variable, hashMatricole); + } + + private static void WriteSingleHashFile(KeyValuePair> variable, + string hashMatricole) + { + var studentHashSummaries = variable.Value; + var toWrite = JsonConvert.SerializeObject(studentHashSummaries, Culture.JsonSerializerSettings); + File.WriteAllText(hashMatricole + "/" + variable.Key + ".json", toWrite); } private static void AddToDict(IDictionary dictionary, Ranking ranking, diff --git a/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Parser.cs b/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Parser.cs index 8c027992..e6fc2cca 100644 --- a/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Parser.cs +++ b/PoliNetwork.Graduatorie.Parser/Utils/Transformer/ParserNS/Parser.cs @@ -429,7 +429,7 @@ private static List ParseMeritTable(Table> table) var enrollCourse = Table.GetFieldByIndex(row, corsoIndex) ?? ""; var position = Table.GetFieldByIndex(row, posIndex) ?? "-1"; var enrollAllowed = EnrollCourseToAllowed(enrollCourse); - var ofa = new Dictionary(); + var ofa = new SortedDictionary(); var ofaEng = Table.GetFieldByIndex(row, ofaEngIndex); if (ofaEng is not null) @@ -505,7 +505,7 @@ private static List ParseCourseTable(Table> table) int englishCorrectAnswersIndex, int ofaEngIndex, int ofaTestIndex, - Dictionary? sectionsIndex + SortedDictionary? sectionsIndex ) { var id = HashMatricola.HashMatricolaMethod(Table.GetFieldByIndex(row, idIndex)); @@ -527,7 +527,7 @@ private static List ParseCourseTable(Table> table) int? englishCorrectAnswers = englishCorrectAnswersValue is not null ? Convert.ToInt16(englishCorrectAnswersValue) : null; - var ofa = new Dictionary(); + var ofa = new SortedDictionary(); var ofaEng = Table.GetFieldByIndex(row, ofaEngIndex); if (ofaEng is not null) @@ -537,7 +537,7 @@ private static List ParseCourseTable(Table> table) if (ofaTest is not null) ofa.Add("TEST", ofaTest.ToLower().Contains("si")); - var sectionsResults = new Dictionary(); + var sectionsResults = new SortedDictionary(); if (sectionsIndex is not null) foreach (var section in sectionsIndex) {