//Saque de moedas public void Withdraw(List <CoinSet> coins) { List <CoinSet> temp = new List <CoinSet>(); foreach (CoinSet cs in coins) { int pos = CoinsSet.BinarySearch(cs); try { CoinsSet[pos].RemoveCoins(cs.Quantity); NumCoins -= cs.Quantity; TotalValue -= cs.TotalValue(); temp.Add(cs); } catch (Exception exception) { AddCoins(temp); //Devolve para a máquina as moedas retiradas até agora if (exception is InsufficientCoinsToWithdrawException) { throw new InsufficientCoinsToWithdrawException(CoinsSet[pos].Quantity, cs.Quantity, cs.Value); } else { //Nesse caso, a variável "pos" é negativa, pois não há um conjunto de moedas do valor solicitado //Assim, a exceção capturada foi a ArgumentOutOfRangeException throw new InsufficientCoinsToWithdrawException(0, cs.Quantity, cs.Value); } } } }
//As moedas são inseridas em ordem crescente de valor public void AddCoins(List <CoinSet> coins) { foreach (CoinSet cs in coins) { int i = CoinsSet.BinarySearch(cs); if (i < 0) { i = 0; for (; i < CoinsSet.Count; i++) { if (cs.Value < CoinsSet[i].Value) { break; } } CoinsSet.Insert(i, new CoinSet(cs.Value)); } AddCoinsInTheSet(i, cs); } }