private List <Filling <T> > GetFillings <T>(List <Filling <T> > fillingsOld) where T : class, IAbbreviation { List <Filling <T> > fillingsNew = new List <Filling <T> >(); foreach (var fillingOld in fillingsOld) { Filling <T> fillingNew = new Filling <T>(); fillingNew.Value = fillingOld.Value; fillingNew.PossibleFillings = new List <PossibleFilling>(); foreach (var fillingOldPossibleFilling in fillingOld.PossibleFillings) { if (fillingOldPossibleFilling.BusyPair != null) { BusyPair busyPairFree = new BusyPair(new Classroom(), fillingOldPossibleFilling.BusyPair.Subject, new Group()); fillingNew.PossibleFillings.Add(new PossibleFilling(fillingOldPossibleFilling.Pair, fillingOldPossibleFilling.StudyDay) { BusyPair = busyPairFree }); } else { fillingNew.PossibleFillings.Add(new PossibleFilling(fillingOldPossibleFilling.Pair, fillingOldPossibleFilling.StudyDay)); } } fillingsNew.Add(fillingNew); } return(fillingsNew); }
public object Clone() { var newClassroom = Classroom.Clone() as Classroom; var newSubject = Subject.Clone() as Subject; var newGroups = Groups.Clone() as Group[]; BusyPair newBusyPair = new BusyPair(newClassroom, newSubject, newGroups); return(newBusyPair); }
/// <summary> /// Добавить один предмет в учебный план и выводит которые не получилось добавить /// </summary> /// <param name="MaxCurricula"> План для добавления предмета </param> /// <returns> Выводить список планов которые не удалось добавить</returns> private List <Curriculum> AddOneSubjectInCurriculum(CurriculaWithAmountPair MaxCurricula) { //Пустой план не получившийся добавить List <Curriculum> curriculaNot = new List <Curriculum>(); //a. Из элемента плана понимаем что за предмет и какая группа var group = MaxCurricula.GetGroups(); var subject = MaxCurricula.GetSubject(); //c. Выбираем аудитории с кол-во мест больше чем в группе //(так как они отсортированы по возрастанию то просто номер первой подходящей аудитории) //Номер Аудитории из массива которая сейчас будет рассматриваться -1 значит нет такой аудитории int NumClassroom = Classrooms.FindIndex(x => x.NumberOfSeats >= group.Sum(y => y.NumberOfPersons)); //Теперь для каждой группы подцепляем занятость var fillingGroup = FillingGroups.Where(x => group.Contains(x.Value)).ToList(); //Добавилась ли пара bool success = false; //i. Цикл по расписанию if (NumClassroom != -1) { for (int cu = 0; cu < NumberStudyDays; cu++) { //d. Цикл по аудиториям for (int cl = NumClassroom; cl < Classrooms.Count; cl++) { //Теперь для аудитории подцепляем занятость var fillingClassroom = FillingClassrooms.First(x => x.Value.ClassroomId == Classrooms[cl].ClassroomId); //Условия что в этот день в эту пару группы не заняты bool FG = true; foreach (var fillingGroup1 in fillingGroup) { bool FG1 = fillingGroup1[cu].BusyPair == null; if (!FG1) { FG = false; break; } } //Условия что в этот день в эту пару классная комната не занята bool FC = fillingClassroom[cu].BusyPair == null; //ToDO: в день не должно быть более 2-х одинаковых пар //все пары в этот день у этой группы var allPairsInGroup = fillingGroup[0].PossibleFillings.Where(x => x.StudyDay == fillingGroup[0].PossibleFillings[cu].StudyDay).ToArray(); //одинаковые пары в день int numOfThisLesson = allPairsInGroup.Where(x => x.BusyPair != null && x.BusyPair.Subject == subject).Count(); //Кол-во пар в день не более 2 bool FNT = true; if (numOfThisLesson >= 2) { FNT = false; } //1. Если в этот день свободна и группа и преподаватель и аудитория if (FNT && FG && FC) { BusyPair busyPair = new BusyPair(Classrooms[cl], subject, group); //a. Добавляем им пару foreach (var fillingGroup1 in fillingGroup) { fillingGroup1[cu].BusyPair = busyPair; } fillingClassroom[cu].BusyPair = busyPair; //b. Заканчиваем 2 цикла(по расписанию и по аудиториям) success = true; break; } //Если закончено } //Цикл по расписанию закончен //b. Заканчиваем 2 цикла(по расписанию и по аудиториям) если пара добавилась if (success) { break; } } } //Цикл аудиторий закончен //e. Если не смогли добавить то if (!success) { //Так как несколько планов то проходим по всем for (int i = 0; i < MaxCurricula.GetNumberPlan(); i++) { //индекс в учебном плане int ind = curriculaNot.FindIndex(x => x.CurriculumId == MaxCurricula.GetCurriculumId()[i]); //i. Если был такой элемент if (ind == -1) { //1. Сохраняем что не смогли добавить в кол-ве 1 пара curriculaNot.Add(MaxCurricula.NewCurriculum(i, 1)); } //Иначе если не было такого элемента else { //1. Добавляем к элементу 1 пару curriculaNot[ind].Number++; } //Если закончено } } //Если закончено //план не получившийся добавить return(curriculaNot); }