//פונקצית שיפור - מקבלת שיבוץ
        //מחפשת את ההורים ששוהים הכי הרבה זמן בבית הספר ומנסה לקצר את זמן השהות שלהם ע"י החלפה עם חברה
        //רק אם לא יוצר שיבוץ לא תקין של אמא בשתי כיתות בו זמנית
        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);
        }