public Dictionary<CoinValue, int> Calculate(VendingMachineEntity machine) { //результат вычислений - сколько нужно отдать монет. //ключ - достоинство монеты, значение - количество var resultCoins = new Dictionary<CoinValue, int>(); int deposited = machine.DepositedAmount; //сколько должны дать сдачи int residual = deposited; //Сколько средств еще нужно отдать //сначала отдаем самые крупные монеты var ordered = machine.VendingMachineCoinLinks .OrderByDescending(x => x.Coin.CoinValue) .ToList(); foreach (var coin in ordered) { if (coin.Count < 1) continue; var coinsCount = Convert.ToInt32(Math.Floor((decimal)(residual / (int)coin.Coin.CoinValue))); if (coinsCount == 0) continue; if (coin.Count < coinsCount) coinsCount = coin.Count; residual -= coinsCount * (int)coin.Coin.CoinValue; resultCoins.Add(coin.Coin.CoinValue, coinsCount); if (residual == 0) break; } return resultCoins; }
internal static VendingMachineEntity Generate(IEnumerable<Coin> coins, IList<Product> products) { var result = new VendingMachineEntity { Name = "Кофейный автомат", VendingMachineCoinLinks = new List<VendingMachineCoinLink>() }; foreach (var coin in coins) { result.VendingMachineCoinLinks.Add(new VendingMachineCoinLink() { Coin = coin, Count = _defaultCount }); } result.VendingMachineProductLinks = new List<VendingMachineProductLink>() { new VendingMachineProductLink{Product = products[0], Count=10}, new VendingMachineProductLink{Product = products[1], Count=20}, new VendingMachineProductLink{Product = products[2], Count=20}, new VendingMachineProductLink{Product = products[3], Count=15} }; return result; }