/*! * \brief Draw a winning number for the lottery. * * The draw number is ensured to not have bee drawn before in this lottery, * and to have been sold for a ticket. * * \return null if no lottery numbers have been sold, or all tickets have won; * otherwise the ticket with the winning number is returned. */ public Ticket DrawWinningNumber() { // If there are no sold tickets, don't draw a number. if (Tickets.Count < 1) { return(null); } // If every sold ticket has won, don't draw a number. if (WinningLotteryNumbers.Count == Tickets.Count) { return(null); } // Pick a winning number, checking that it's not still availibe // (i.e. a ticket has this number) and it's not already been picked. var winningNumber = Rng.Next(LotteryNumberMin, LotteryNumberMax + 1); while (LotteryNumbers[winningNumber] != InvalidLotteryNumber || WinningLotteryNumbers.Contains(winningNumber)) { winningNumber = Rng.Next(LotteryNumberMin, LotteryNumberMax + 1); } // Store winning number and return the winning ticket. WinningLotteryNumbers.Add(winningNumber); return(Tickets.Find(T => T.LotteryNumber == winningNumber)); }
/*! * \brief Remove a ticket from the lottery. * * If the ticket has not been sold no action will be made. * Otherwise, the ticket's number will be added to the availible numbers again, * and if it was a winning number it will be removed from the list of winners as well. */ public void RemoveTicket(Ticket ticket) { var target = Tickets.Find(T => T.LotteryNumber == ticket.LotteryNumber); if (target == null) { return; } // Remove the number from winners (if there) and add it to the availible numbers again, // before removing it from the list of sold tickets. WinningLotteryNumbers.Remove(target.LotteryNumber); ++NumLotteryNumbersLeft; LotteryNumbers[target.LotteryNumber] = target.LotteryNumber; Tickets.Remove(target); }
/*! * \brief Export the lottery session to a given file. * \param exportFile String stream denoting target export file. */ public void ExportToFile(Stream exportFile) { var xmlRoot = new XElement(XmlTagNames.Root, new XElement(XmlTagNames.MaxLotteryNumber, LotteryNumberMax), new XElement(XmlTagNames.Tickets, new XAttribute(XmlTagNames.TicketsPriceAttribute, TicketPrice), Tickets.Select(t => new XElement(XmlTagNames.Ticket, // Only lottery number is mandatory. Owner and comment are only included if not empty. new XElement(XmlTagNames.TicketLotteryNumber, t.LotteryNumber), (string.IsNullOrEmpty(t.Owner) ? null : new XElement(XmlTagNames.TicketOwner, t.Owner)), (string.IsNullOrEmpty(t.Comment) ? null : new XElement(XmlTagNames.TicketComment, t.Comment)) )) ), // Winners are optional. If none have been drawn, don't empty tag. (WinningLotteryNumbers.Any() ? new XElement("Winners", WinningLotteryNumbers.Select(w => new XElement("Winner", new XAttribute("LotteryNumber", w)))) : null) ); xmlRoot.Save(exportFile); }
/*! * \brief Remove a winning lottery number, if it's in the collection. * * NOTE that this DOES NOT delete the ticket with the winning number, * it simply removes the winning association. */ public void RemoveWinningTicket(int winningLotteryNumber) { WinningLotteryNumbers.Remove(winningLotteryNumber); }