У меня есть какой-то финансовый отчет, где каждая строка - это какой-то объект, который зависит от предыдущего.Мне нужно получить список этих объектов.Когда я вычисляю каждую строку, мне нужно проанализировать ее значения и внести некоторые исправления, если это необходимо.
Вот мой класс ReportRow:
public class ReportRow
{
public ReportRow (ReportRow previousRow)
{
PreviousRow = previousRow;
}
public ReportRow PreviousRow;
private decimal? _bankRest;
public decimal BankRest
{
get
{
if (!_bankRest.HasValue)
_bankRest = PreviousRow.BankRest - CurrentInvestments;
return _bankRest.Value;
}
set
{
_bankRest = value;
}
}
public decimal CurrentInvestments => Sum1 + Sum3;
public decimal Sum1 { get; set; }//here is some formula
public decimal Sum3 { get; set; }//here is some other formula
}
Этот класс очень упрощен, но, я думаю, он может помочь понять проблему.Здесь может быть ситуация, когда CurrentInvestments может стать слишком большим, и BankRest станет отрицательным.(CurrentInvestments имеет более сложную формулу и может стать очень большим).
Вот как я собираю данные отчета.
public void GetReport()
{
ReportRow firstRaw = GetFirstRow();//here i somehow get first row to start calculation
List<ReportRow> report = new List<ReportRow>(); //the full report
ReportRow previous = firstRaw;
for (int i = 0; i < 100000; i++)
{
ReportRow next = new ReportRow(previous);
AnalizeAndFix(next);//Here is where I have a problem
report.Add(next);
previous = next; //current becomes previous for next iteration
}
}
У меня проблема с функцией AnalizeAndFix (следующая).Если BankRest текущего периода отрицателен (<0), мне нужно отменить предыдущий период CurrentInvestments (сделать CurrentInvestments = 0, что увеличит предыдущий BankRest).Если это не поможет, мне нужно сделать еще два шага и отменить инвестиции в этот ряд.Тогда проверь текущий Raw BankRest.Мне нужно повторить это 6 раз.Если установка CurrentInvestments на 0 из шести предыдущих строк не помогла - выведите исключения.И в общем отчете все периоды, которые были затронуты, должны быть обновлены.Мне удалось исправить только один предыдущий ряд, но я не знаю, как это сделать еще 5 раз.Вот код для моего AnalizeAndFix </p>
private void AnalizeAndFix(ref ReportRow current)
{
if (current.BankRest < 0)
{
int step = 0;
while (current.BankRest < 0 || step < 6)
{
step++;
var previous = current.PreviousRow;
previous.CancellInvestments(); //I set CurrentInvestments to 0
current = new ReportRow(previous); // create a new report based on recalculated previous
}
}
}
Если я использую этот подход, окончательный отчет покажет мне пересчитанные текущие и предыдущие строки, как я хочу (я думаю).Однако я не знаю, как это сделать еще 5 раз, поэтому все затронутые строки будут отображаться как измененные в окончательном отчете.Или, может быть, мне нужно переосмыслить всю систему и сделать то, что мне нужно, другим способом?