//פונקצית שיפור - מקבלת שיבוץ //מחפשת את ההורים ששוהים הכי הרבה זמן בבית הספר ומנסה לקצר את זמן השהות שלהם ע"י החלפה עם חברה //רק אם לא יוצר שיבוץ לא תקין של אמא בשתי כיתות בו זמנית public void shipur(List <scheduling> l) { List <parents> lst_par = allParents.Where(b => b.code_instation == this.idMosad).ToList(); ParentMark[] lst_mark = new BL.ParentMark[lst_par.Count / 100]; int cur = 0; perentsBL pars = new perentsBL(); double avg = 0; TimeSpan min, max, temp; int i; foreach (parents p in lst_par) { List <studens> lst_k = pars.get_Allkids(p.id); min = new TimeSpan(23, 59, 0); max = new TimeSpan(00, 00, 0); for (i = 0; i < lst_k.Count(); i++) { //השוואה של timespan temp = l.Where(x => x.id_student == lst_k[i].id).FirstOrDefault().hour_; if (temp > (max)) { max = temp; } if (temp < min) { min = temp; } } avg = (max - min).TotalMinutes / lst_k.Count(); //עצם שמכיל את האמא יחד עם הממוצע שלה ParentMark pm = new BL.ParentMark(p, avg); //הכנסת ההורה למקום המתאים במערך (אם בכלל) כך שבסיום הלולאה המערך יכיל את 1% ההורים שהממוצע שלהם הוא הגרוע ביותר ממוינים בסדר יורד for (i = 0; i < cur && avg > lst_mark[i].avg; i++) { ; } if (i == cur && cur < lst_mark.Length) { lst_mark[cur++] = pm; } else { if (i < cur) { for (int j = cur++; j > i; j--) { lst_mark[j] = lst_mark[j - 1]; } lst_mark[i] = pm; } else if (cur == lst_mark.Length - 1 && lst_mark[cur].avg < avg) { lst_mark[cur] = pm; } } } //מעבר על מערך האמהות שהשיבוץ שלהן הוא הגרוע ביותר מבחינת השעות foreach (ParentMark item in lst_mark) { //מציאת כל השיבוצים של האמא List <scheduling> kids_scd = new List <scheduling>(); List <studens> lst_kids = pars.get_Allkids(item.par.id); foreach (studens s in lst_kids) { kids_scd.Add(l.Where(scd => scd.id_student == s.id).FirstOrDefault()); } kids_scd.OrderBy(ks => ks.hour_); List <TimeSpan> free = new List <TimeSpan>(); //חיפוש כל שעות החורים של האמא for (TimeSpan t = kids_scd[0].hour_ + new TimeSpan(0, 15, 0); t < kids_scd[kids_scd.Count - 1].hour_; t += (new TimeSpan(0, 15, 0))) { if (kids_scd.Where(ks => ks.hour_.Equals(t)).FirstOrDefault() == null) { free.Add(t); } } //מעבר על רשימת החורים של האמא //ונסיון לבצע החלפה בין השעה המוקדמת ביותר או המאוחרת ביותר לאחת השעות הפנויות foreach (TimeSpan t in free) { //נסיון להחליף את הבת המשובצת ראשונה עם החור if (Replace(l, kids_scd[0], t)) { break; } //נסיון להחליף את הבת המשובצת אחרונה עם החור if (Replace(l, kids_scd[kids_scd.Count - 1], t)) { break; } } } }
//public List<studens> SortByEmail(List<studens> ls) //{ // return ls.OrderBy(x => x.parents.email).ToList(); //} //פונקצית הערכה //מקבלת אוסף -ליסט- של השיבוץ של כל בית הספר //ומחזירה ציון לשיבוץ //לפי //1. פרק הזמן שאמא לכמה בנות שוהה בבית הספר //2. רמת סטיה מבקשות של אמהות private int mark(List <scheduling> l) { List <parents> lst_par = perentsDAL.GetParentByCodeInstation(this.idMosad); double avg = 0; int mark = 100, cntExp = 0; TimeSpan from = new TimeSpan(00, 0, 0); TimeSpan to = new TimeSpan(00, 0, 0); TimeSpan min = new TimeSpan(23, 59, 0); TimeSpan max = new TimeSpan(00, 00, 0); TimeSpan temp; perentsBL pars = new perentsBL(); requestBL r = new requestBL(); //1. פרק הזמן שאמא לכמה בנות שוהה בבית הספר foreach (parents p in lst_par) { List <studens> lst_k = pars.get_Allkids(p.id); min = new TimeSpan(23, 59, 0); max = new TimeSpan(00, 00, 0); for (int i = 0; i < lst_k.Count(); i++) { //השוואה של timespan temp = l.Where(x => x.id_student == lst_k[i].id).FirstOrDefault().hour_; if (temp > (max)) { max = temp; } if (temp < min) { min = temp; } } avg = (max - min).TotalMinutes; avg = (max - min).TotalMinutes / lst_k.Count(); if (avg > 30) { cntExp++; } } mark = mark - cntExp; cntExp = 0; //2.רמת סטיה מבקשות של אמהות //עובר על רשימת האימהות foreach (parents pa in lst_par) { List <studens> lst_k = pars.get_Allkids(pa.id); List <studens> st; TimeSpan scheTime = new TimeSpan(); parents p = new parents(); request h = allRquest.Where(rr => rr.id_parent == pa.id).FirstOrDefault(); if (h != null) { from = h.from_hour; to = h.to_hour; st = lst_studens.Where(y => y.id_parent == pa.id).ToList(); //שולף מרשימת השיבוצים שהתקבלה את השעות של הילדים של ההורה foreach (studens item in lst_k) { scheTime = l.Where(e => e.id_student == item.id).Select(t => t.hour_).FirstOrDefault(); if (scheTime < from || scheTime > to) { cntExp++; } } } } mark = mark - cntExp; return(mark); }