Exemple #1
0
        public IEnumerable <Track> Schedule()
        {
            List <Track> tracks   = new List <Track>();
            var          allTalks = talksLoader.Load(LoadTalkBy.DurationDescending);
            var          trackId  = 1;

            int totalMinutesAllowed     = Utilities.LimitForMorningSession;
            int afternoonMinutesAllowed = Utilities.LimitForAfterNoonSession;

            while (allTalks.Any(p => !p.AlreadyTaken))
            {
                var track = new Track {
                    Name = $"Track {trackId}", Talks = new List <Talk>()
                };
                bool        lunchTalkAdded = false, networkTalkAdded = false;
                var         ellapsedMinutes         = 0;
                int         afternoonElapsedMinutes = 0;
                List <Talk> talks = new List <Talk>();
                foreach (var talk in allTalks.Where(p => !p.AlreadyTaken))
                {
                    // morning session talks
                    if ((talk.Duration + ellapsedMinutes) <= totalMinutesAllowed && !talk.AlreadyTaken)
                    {
                        talks.Add(talk);
                        ellapsedMinutes  += talk.Duration;
                        talk.AlreadyTaken = true;
                        continue;
                    }

                    if (!lunchTalkAdded && ellapsedMinutes <= totalMinutesAllowed)
                    {
                        var tk = allTalks.FirstOrDefault(p => p.Duration == (totalMinutesAllowed - ellapsedMinutes));
                        if (tk != null)
                        {
                            talks.Add(tk);
                            tk.AlreadyTaken = true;
                        }

                        talks.Add(new Talk {
                            Title = "LUNCH", Duration = 60
                        });
                        lunchTalkAdded = true;
                    }

                    // afternoon session talks
                    if ((talk.Duration + afternoonElapsedMinutes) <= afternoonMinutesAllowed && !talk.AlreadyTaken)
                    {
                        talks.Add(talk);
                        afternoonElapsedMinutes += talk.Duration;
                        talk.AlreadyTaken        = true;
                        continue;
                    }

                    if (!networkTalkAdded && afternoonElapsedMinutes <= afternoonMinutesAllowed)
                    {
                        var tk = allTalks.FirstOrDefault(p => p.Duration == (afternoonMinutesAllowed - afternoonElapsedMinutes));
                        if (tk != null)
                        {
                            talks.Add(tk);
                            tk.AlreadyTaken = true;
                        }

                        talks.Add(new Talk {
                            Title = "Networking", Duration = 60
                        });
                        networkTalkAdded = true;
                    }
                }

                track.Talks.AddRange(talks);
                tracks.Add(track);
                trackId += 1;
            }

            return(tracks);
        }
Exemple #2
0
        public IEnumerable <Track> Schedule(ScheduleTalkBy scheduleTalkBy)
        {
            List <Track> tracks   = new List <Track>();
            var          allTalks = talksLoader.Load(scheduleTalkBy);
            var          trackId  = 1;

            int totalMinutesAllowed     = 60 * (Constants.LUNCHHOUR - Constants.SESSIONSTARTSAT);;
            int afternoonMinutesAllowed = 60 * (Constants.SESSIONENDSAT - Constants.LUNCHHOUR - 1);

            while (allTalks.Any(p => !p.AlreadyTaken))
            {
                var track = new Track {
                    Name = $"Track {trackId}", Talks = new List <Talk>()
                };
                bool lunchTalkAdded          = false;
                bool networkTalkAdded        = false;
                int  ellapsedMinutes         = 0;
                int  afternoonElapsedMinutes = 0;
                var  talks = new List <Talk>();
                var  today = DateTime.Today.Add(new TimeSpan(09, 00, 00));

                foreach (var talk in allTalks.Where(p => !p.AlreadyTaken))
                {
                    // morning session talks
                    if ((talk.Duration + ellapsedMinutes) <= totalMinutesAllowed && !talk.AlreadyTaken)
                    {
                        talks.AddTalk(talk, today);
                        today            = today.Add(new TimeSpan(00, talk.Duration, 00));
                        ellapsedMinutes += talk.Duration;
                        continue;
                    }

                    if (!lunchTalkAdded && ellapsedMinutes <= totalMinutesAllowed)
                    {
                        var tk = allTalks.FirstOrDefault(p => p.Duration == (totalMinutesAllowed - ellapsedMinutes));
                        if (tk != null)
                        {
                            talks.Add(tk);
                            tk.AlreadyTaken = true;
                        }

                        today          = AddLunchTalk(talks);
                        lunchTalkAdded = true;
                    }

                    // afternoon session talks
                    if ((talk.Duration + afternoonElapsedMinutes) <= afternoonMinutesAllowed && !talk.AlreadyTaken)
                    {
                        talks.AddTalk(talk, today);
                        today = today.Add(new TimeSpan(00, talk.Duration, 00));
                        afternoonElapsedMinutes += talk.Duration;
                        continue;
                    }

                    if (!networkTalkAdded && afternoonElapsedMinutes <= afternoonMinutesAllowed)
                    {
                        var tk = allTalks.FirstOrDefault(p => p.Duration == (afternoonMinutesAllowed - afternoonElapsedMinutes));
                        if (tk != null)
                        {
                            talks.Add(tk);
                            tk.AlreadyTaken = true;
                        }

                        today            = this.AddNetworkTalk(talks, today);
                        networkTalkAdded = true;
                        break;
                    }
                }

                if (!talks.Any(p => p.Title == TitleNetworking))
                {
                    today = this.AddNetworkTalk(talks, today);
                }

                track.Talks.AddRange(talks);
                tracks.Add(track);
                trackId += 1;
            }

            return(tracks);
        }