[英]Course Scheduling with C#
我正在為學校的日程安排項目工作,該課程將課程分配給可用的教室。 我有這樣的樹表(簡化):
TCourse:CourseID,CourseCode,小時,容量,ScheduleID ...
TClassroom:ClassroomID,ClassroomName,配額...
TCourseClassroom:CourseClassroomID,CourseID,ClassroomID,StartHour,FinishHour,ScheduleID
08:00-20:00之間的時間
下面的代碼逐一獲取課程,並為他們分配容量最接近的教室,然后更新教室以表明已使用教室。 (將代碼翻譯成英文,以供您閱讀和理解)
public ActionResult Schedule()
{
int[] hours = { 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
using (ApsContext db = new ApsContext())
{
List<TCourse> courses = new List<TCourse>();
List<TClasssroom> clasRooms = new List<TClasssroom>();
int lastScheduleId = 0;
courses = db.TCourse.OrderBy(x => x.Quota).ToList();
foreach (var itemCourse in courses)
{
var clasRoom = db.Classroom.Where(x => x.PlanID == lastScheduleId && x.Capacity >= itemCourse.Quota).OrderBy(x => x.Capacity).FirstOrDefault();
if (classRoom != null)
{
var courseId = itemCourse.CourseID;
var classRoomId = clasRoom.ClassroomID;
var scheduleId = itemCourse.ScheduleID + 1;
db.Entry(classRoom).Entity.ScheduleID = scheduleId;
db.SaveChanges();
CourseClassroom newCourseClassroom = new CourseClassroom();
newCourseClassroom.CourseID = courseId;
newCourseClassroom.ClasssroomID = classRoomId;
newCourseClassroom.ScheduleID = scheduleId;
db.TCourseClassroom.Add(newCourseClassroom);
db.SaveChanges();
}
}
return RedirectToAction("Schedule");
}
}
這段代碼只使用一次班,但是一天教室只有12個小時。 想想所有的課程都是2小時。 因此,我每天需要使用該教室6次。 我無法想象達到此目的的最佳方法。 我認為要更新數據庫以供教室使用數小時,還是應該僅用代碼來完成? 任何想法都會有所幫助。 提前致謝。
我有一個解決方案,但可能不是最快的解決方案。
.FirstOrDefault();
句子,因此在var classRoom
您可以擁有一個Enumerable,其中所有類的大小都var classRoom
容納該課程。 TCourseClassroom
教室,請在TCourseClassroom
找到包含該教室的所有CourseClassroom,並通過EndHour對其進行訂購。 public ActionResult Schedule(){
int[] hours = { 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
using (ApsContext db = new ApsContext())
{
List<TCourse> courses = new List<TCourse>();
List<TClasssroom> clasRooms = new List<TClasssroom>();
int lastScheduleId = 0;
courses = db.TCourse.OrderBy(x => x.Quota).ToList();
foreach (var itemCourse in courses)
{
var classRoomList = db.Classroom.Where(x => x.PlanID == lastScheduleId && x.Capacity >= itemCourse.Quota).OrderBy(x <= x.Capacity);
TClasssroom availableClassRoom;
foreach(TClasssroom classRoom in classRoomList)
{
TCourseClassroom courseClassroomList = db.TCourseClassroom.FindAll(x => x.ClassroomID == clasRoom.ClassroomID).OrderBy(x > x.EndHour).First();
if(courseClassroomList == null)
{
availableClassRoom = classRoom;
}
else
{
if(courseClassroomList.EndHour + itemCourse.Hour <= 20)
{
availableClassRoom = classRoom;
}
}
}
if (availableClassRoom != null)
{
var courseId = itemCourse.CourseID;
var classRoomId = clasRoom.ClassroomID;
var scheduleId = itemCourse.ScheduleID + 1;
db.Entry(classRoom).Entity.ScheduleID = scheduleId;
db.SaveChanges();
CourseClassroom newCourseClassroom = new CourseClassroom();
newCourseClassroom.CourseID = courseId;
newCourseClassroom.ClasssroomID = classRoomId;
newCourseClassroom.ScheduleID = scheduleId;
db.TCourseClassroom.Add(newCourseClassroom);
db.SaveChanges();
}
}
return RedirectToAction("Schedule");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.