/// <summary>
        /// Купить напиток
        /// </summary>      
        public Wallet BuyDrink(WendingDrinks drinkType)
        {
            if (Store[drinkType] < 1) throw new Exception("К сожалению данный напиток закончился. Приносим извинения!");

            var price = (int)drinkType;
            if (_EscrowSum < price)
                throw new Exception("Недостаточно средств");

            var allCoins = new Wallet();
            allCoins.Flush(Wallet, false);
            allCoins.Flush(Escrow, false);

            var change = CountChange(allCoins, price);

            Store[drinkType] -= 1;

            // Обнуляем кошелек
            Escrow.Flush(Wallet);
            //Высыпаем в кошелек все оставшиеся после сдачи монеты 
            Wallet.Flush(allCoins);
            //Обнуляем escrow с помощью временного allCoins кошелька
            allCoins.Flush(Escrow);
            _EscrowSum = 0;

            //Возвращаем сдачу
            return change;
        }
 /// <summary>
 /// Пересыпать монеты из другого кошелька 
 /// </summary>       
 public void Flush(Wallet wallet, bool leaveEmpty = true)
 {
     var nominals = Enum.GetValues(typeof(Nominals)) as Nominals[];
     foreach (var nominal in nominals)
     {
         this[nominal] += wallet[nominal];
         wallet[nominal] = leaveEmpty ?  0: wallet[nominal];
     }
 }
        static void Main(string[] args)
        {
            var port = ConfigurationManager.AppSettings["port"];
            var baseAddress = string.Format("http://localhost:{0}/", port);

            var wallet = new Wallet();

            wallet[Nominals.Ten] = 10;
            wallet[Nominals.Two] = 2;
            wallet[Nominals.One] = 100;

            var wallet2 = new Wallet();

            wallet2.Flush(wallet, false);

            // Start OWIN host 
            WebApp.Start<Startup>(baseAddress);
           

            Console.ReadLine();
        }
        /// <summary>
        /// Рекурсивно посчитать сдачу минимально возможным количеством монет
        /// </summary       
        private Wallet CountChangeRecursive(int changeSum, Wallet change, Wallet allCoins)
        {
            if (changeSum == 0) return change;

            var result = Enum.GetValues(typeof(Nominals))
                .Cast<Nominals>()
                .Select(v =>
                    {
                        var diff = changeSum - (int)v;
                        return diff >= 0 && allCoins[v] != 0 ?
                           new ChangeDiff{ Nominal = v, Diff = diff } :
                           new ChangeDiff{ Nominal = v, Diff = int.MaxValue };
                    }).Min();

            if (result.Diff == int.MaxValue)
                throw new Exception("Приносим извенения!К сожалению автомат не может выдать сдачу.");

            allCoins[result.Nominal] -= 1;
            change[result.Nominal] += 1;
            return CountChangeRecursive(result.Diff, change, allCoins);
        }
 /// <summary>
 /// Посчитать сдачу
 /// </summary   
 private Wallet CountChange(Wallet allCoins, int price)
 {
     var changeSum = _EscrowSum - price;
     return CountChangeRecursive(changeSum, new Wallet(), allCoins);
 }