private int DrawAllPots() { AddMessage(null, null, "Starte Ziehung"); // Zuerst nachsehen, ob Wünsche offen sind foreach (var game in Games) { if (game.Seats.Count >= game.CoursesWanted) { // alle Lose ungültig machen => hat schon alles foreach (var lot in game.Lots) { lot.IsValid = false; lot.IsTouched = true; lot.AddMessage("Die Wünsche konnten erfüllt werden, dieses Los wird nicht mehr gebraucht"); AddMessage(lot.Course, lot.Subscription, "Die Wünsche konnten erfüllt werden, dieses Los wird nicht mehr gebraucht"); } } } foreach (var lotPot in LotPots.OrderByDescending(x => x.BookingRank)) { // Ziehen ExecuteDrawing(lotPot); // Alle erfolgreichen Tickets ansehen => nicht mehr auf Warteliste foreach (var lot in lotPot.Lots.Where(x => !x.Subscription.OnWaitingList)) { // das zugehörige Spiel suchen var game = Games.SingleOrDefault(x => x.UserId.Equals(lot.Subscription.UserId)); // Die besten n Lose, also Prio 1,2,3 var studentLots = game.Lots.OrderBy(x => x.Priority).Take(game.CoursesWanted).ToList(); // Student ist glücklich, wenn er alle seine Prio 1 bis n bekommen hat var isHappy = !studentLots.Any(x => x.Subscription.OnWaitingList); if (isHappy) { // jetzt können wir alle seine anderen Lose auf "invalid" setzen // warum: das sind die Lose mit geringer Prio, die er nicht mehr braucht // er hat schon die besten Prios erhalten foreach (var drawingLot in studentLots.Where(x => x.Subscription.OnWaitingList)) { drawingLot.IsValid = false; drawingLot.IsTouched = true; drawingLot.AddMessage("Die Wünsche konnten erfüllt werden, dieses Los wird nicht mehr gebraucht"); AddMessage(drawingLot.Course, drawingLot.Subscription, "Die Wünsche konnten erfüllt werden, dieses Los wird nicht mehr gebraucht"); } } } } // jetzt alle Plätze auflösen, die zu viel vergeben wurden var nReject = 0; foreach (var game in Games) { var studentLots = game.Lots.OrderBy(x => x.Priority).ToList(); // Student ist glücklich, wenn er die Anzahl der gewünschten Plätze erhalten hat var isHappy = studentLots.Count(x => !x.Subscription.OnWaitingList) >= game.CoursesWanted; if (isHappy) { var i = 0; // jetzt können wir alle seine anderen Lose auf "invalid" setzen foreach (var drawingLot in studentLots) { if (!drawingLot.Subscription.OnWaitingList) { i++; if (i > game.CoursesWanted) { drawingLot.IsValid = false; drawingLot.IsTouched = true; drawingLot.Subscription.OnWaitingList = true; // Zurück auf die Warteliste drawingLot.AddMessage( "Zuviel vergebenes Los. Platz wird wieder freigegeben"); nReject++; AddMessage(drawingLot.Course, drawingLot.Subscription, "Zuviel vergebenes Los. Platz wird wieder freigegeben"); } } } } } AddMessage(null, null, $"Ziehung beendet mit {nReject} wieder zurückgegebenen Plätzen"); return(nReject); }
private int DrawAllPots() { // Zuerst nachsehen, ob Wünsche offen sind foreach (var game in Games) { if (game.Seats.Count >= game.CoursesWanted) { // alle Lose ungültig machen => hat schon alles foreach (var lot in game.Lots) { lot.IsValid = false; lot.IsTouched = true; lot.Message = "Die Wünsche konnten erfüllt werden, Los wird nicht mehr gebraucht"; } } } foreach (var lotPot in LotPots.OrderByDescending(x => x.BookingRank)) { // Ziehen ExecuteDrawing(lotPot); // Alle erfolgreichen Tickets ansehen => nicht mehr auf Warteliste foreach (var lot in lotPot.Lots.Where(x => !x.Subscription.OnWaitingList)) { // das zugehörige Spiel suchen var game = Games.SingleOrDefault(x => x.UserId.Equals(lot.Subscription.UserId)); var studentLots = game.Lots.OrderBy(x => x.Priority).Take(game.CoursesWanted).ToList(); // Student ist glücklich, wenn er seine Prio 1 bis n bekommen hat var isHappy = !studentLots.Any(x => x.Subscription.OnWaitingList); if (isHappy) { // jetzt können wir alle seine anderen Lose auf "invalid" setzen foreach (var drawingLot in studentLots.Where(x => x.Subscription.OnWaitingList)) { drawingLot.IsValid = false; drawingLot.IsTouched = true; drawingLot.Message = "Die Wünsche konnten erfüllt werden, Los wird nicht mehr gebraucht"; } } } } // jetzt alle Plätze auflösen, die zu viel vergeben wurden var nReject = 0; foreach (var game in Games) { var studentLots = game.Lots.OrderBy(x => x.Priority).ToList(); // Student ist glücklich, wenn er die Anzahl der gewünschten Plätze erhalten hat var isHappy = studentLots.Count(x => !x.Subscription.OnWaitingList) >= game.CoursesWanted; if (isHappy) { var i = 0; // jetzt können wir alle seine anderen Lose auf "invalid" setzen foreach (var drawingLot in studentLots) { if (!drawingLot.Subscription.OnWaitingList) { i++; if (i > game.CoursesWanted) { drawingLot.IsValid = false; drawingLot.IsTouched = true; drawingLot.Subscription.OnWaitingList = true; // Zurück auf die Warteliste drawingLot.Message = "Die Wünsche konnten erfüllt werden, Los wird nicht mehr gebraucht"; nReject++; } } } } } return(nReject); }