public RatesCalculationResult CalculateResult(Currency baseCurrency, Currency[] currencies, decimal amount, List<Rate> rates) { var bestResult = new RatesCalculationResult {Currency = baseCurrency, MaxAmount = amount}; foreach (var currency in currencies) { var currentResult = CalculateResultByCurrency(rates, currency, amount); if (currentResult.MaxAmount > bestResult.MaxAmount) { bestResult = currentResult; } } return bestResult; }
public RatesCalculationResult CalculateResultByCurrency(List<Rate> rates, Currency currency, decimal amount) { var bestResult = new RatesCalculationResult { Currency = currency, MaxAmount = 0 }; for (var startDateIndex = 0; startDateIndex < rates.Count - 1; startDateIndex++) { var startDateRate = rates[startDateIndex].Rates[currency]; for (var endDateIndex = startDateIndex + 1; endDateIndex < rates.Count; endDateIndex++) { var endDateRate = rates[endDateIndex].Rates[currency]; var currentAmount = amount*startDateRate/endDateRate - rates[endDateIndex].Date.Subtract(rates[startDateIndex].Date).Days; if (currentAmount > bestResult.MaxAmount) { bestResult.MaxAmount = currentAmount; bestResult.StartDate = rates[startDateIndex].Date; bestResult.EndDate = rates[endDateIndex].Date; } } } return bestResult; }