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