/// <summary> /// check out listener /// </summary> /// <param name="data">een Dictionary met een wens en een Id</param> public void CheckoutGuest(Dictionary <string, string> data) { //maak variable string value = data.Values.ToList().Last().ToString(); int guestId = Int32.Parse(value); Guest guest = null; //voor elke gast in GuestList kijk of de Id gelijk is aan guestId foreach (Guest g in GuestList) { if (g.GuestId == guestId) { guest = g; break; } } //zet de kamer van guest in _dirtyroom list en verwijder de gast uit guest list (check out) _dirtyroom.Enqueue(guest.MyRoom); GuestList.Remove(guest); }
public void RemoveGuest(Guest gv) { GuestList.Remove(gv); }
/// <summary> /// Each time a PerformAction is called we check what Status the elevator /// is in and we are removing the guests from the RemoveGuest list /// Because we have a "Smart" elevator, the elevator will check wich list is bigger and then handle the biggest list first until it's empty /// which means that the elevator will always make the uplist smaller and if the list is equal to zero the elevator will go down /// /// This is just like in real life. If there are 3 people, each person is on a different floor /// and lets say guestA presses the button first and the elevator is also on floor 3 now /// GuestA,B wants to go down but guestC wants to go up. /// /// which means our Up list is filled with guestC and our Down list is filled with guestA and B /// this will lead to that our down list is bigger and the lift will first drop off guestA and B to the requested floor and will then pick up guestC /// this elevator will not jump up and down /// floor: 5 /// floor: 4 guestC /// floor: 3 guestA elevator /// floor: 2 guestB /// floor: 1 /// </summary> public void PerformAction() { //We wanted to use a foreach loop but because of the threading we had to do a forloop //Difference between foreach and forloop is that a foreach will crash when something is changed during the simulation and forloop can adjust RemoveGuests.Clear(); for (int i = 0; i < GuestList.Count; i++) { if (GuestList[i] is IMovable g) { if (Position.Y == g.FinalDes.Position.Y) { g.Status = MovableStatus.LEAVING_ELEVATOR; g.Area = Hotel.GetArea(Position); RemoveGuests.Add(GuestList[i]); } } } //Second forloop to remove the guest in order to not have an error for (int i = 0; i < RemoveGuests.Count; i++) { GuestList.Remove(RemoveGuests[i]); } RemoveGuests.Clear(); //Removing Down list items if (Down.Count != 0 && Down[0] == Position.Y) { Down.RemoveAt(0); } //Removing Up list items if (Up.Count != 0 && Up[0] == Position.Y) { Up.RemoveAt(0); } //If the status is up we perform the method _elevatorGoesup(); if (Status == MovableStatus.UP) { _elevatorGoesUp(); } //If the status is down we perform the method _elevatorGoesDown() with an extra check that the elevator will not leave the field. else if (Status == MovableStatus.DOWN && Position.Y < Hotel.HotelHeight) { _elevatorGoesDown(); } else { Status = MovableStatus.IDLE; } //In order to draw the guests correctly on the field we change the position to the elevator position foreach (IMovable human in GuestList) { human.Position = Position; } AddDestinationFloor(); //If both lists are empty we are changing the elevatorCart status and the elevator will go down if (Up.Count == 0 && Down.Count == 0) { Status = MovableStatus.IDLE; } if (Status == MovableStatus.IDLE) { _ElevatorDoesNothing(); } }