void assignEmployeeToGroup(Employee employee, EmployeeGroup group, String profession) { employee.CurrentProfession = profession; group.addEmployee(employee); }
/// <summary> /// Переміщення працівника в іншу групу, підставляючи на його місце вільного працівника, або рекурсивно працівника з іншої групи. /// </summary> /// <param name="proffesionName">Професія</param> /// <param name="recursionLevel">Для заборони нескінченної рекурсії</param> /// <returns></returns> public bool reassignEmployeeToGroupWithReplacement(EmployeeGroup destinationGroup,string proffesionName,int recursionLevel) { //Спочатку шукаємо робітника з потрібною професією в списку вільних працівників foreach(Employee employee in availableEmployees) { if (employee.hasProfession(proffesionName)) { employee.CurrentProfession = proffesionName; destinationGroup.addEmployee(employee); return true; } if (recursionLevel > 10) return false; for (int i = 0; i < groups.Count(); i++) { for (int j = 0; j< groups[i].getEmployees().Count; j++) { EmployeeGroup currentGroup = groups[i]; Employee currentEmployee = currentGroup.getEmployees()[j]; if (currentEmployee.hasExtraProfession(proffesionName)) { if (reassignEmployeeToGroupWithReplacement(currentGroup, currentEmployee.CurrentProfession, recursionLevel + 1)) { currentGroup.freeEmployee(currentEmployee);//Робітник виходить з групи, бо на його місце став інший. currentEmployee.CurrentProfession = proffesionName;//Поточною професією ставимо ту, яка нам потрібна щоб в нього була destinationGroup.addEmployee(currentEmployee); return true; } } } } } return false; //Якщо вільного працівника з цією професією немає, то потрібно переназначити на цю професію компетентного працівника, в свою чергу // замінивши його на компетентного працівника з пулу (або так само рекурсивно взяти з групи). Замутно короче. }