【问题标题】:Course Scheduling with C#使用 C# 进行课程安排
【发布时间】:2015-10-29 09:50:06
【问题描述】:

我正在为一所学校制定一个日程安排项目,该项目将课程分配给可用的教室。我有这样的树表(简化):

TCourse:CourseID、CourseCode、Hours、Capacity、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次。我无法想象为此目的的最佳方式。我想更新教室使用几个小时的数据库,还是我应该只用代码来做?任何想法都会有所帮助。提前致谢。

【问题讨论】:

    标签: c# asp.net-mvc entity-framework linq-to-entities


    【解决方案1】:

    我有一个解决方案,但可能不是最快的。

    1. 删除 .FirstOrDefault(); 句子,因此在 var classRoom 中,您有一个 Enumerable,其中包含课程所需的所有大类。
    2. 对于每个教室,在 TCourseClassroom 中找到包含该教室的所有 CourseClassroom,并使用 EndHour 对其进行排序。
    3. 检查你的 course Hour 加上 CourseClassroom 的 EndHour 是否小于 20,如果是,你可以把你的课程放在这个班级。

    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");
    }
    

    }

    【讨论】:

    • 但是 Start 和 EndHour 还没有值。需要在 foreach 中更新该值。顺便说一句,TCourseClassroom 没有 FindAll 方法。还是有用的,谢谢。
    • 那又如何:将所有教室放在一个数组中,一小时。所以我将有 12 行该教室,而不是用这些更新 TCourseClassroom 表。
    • 那么 TCourse.Hours 返回课程的总小时数,而不是时间?我可以用这个新的观点来改变代码。
    • 是的。总小时数。当我们将该课程放到教室时,我将更新开始和结束时间(第一门课程 08-10)。然后另一门课程将在最后结束时间 (10-12) 之后使用该教室。
    • 那么你可以开始用课程填满教室,直到 22:00... 我会更新代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多