Пересчитать список связанных объектов - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть какой-то финансовый отчет, где каждая строка - это какой-то объект, который зависит от предыдущего.Мне нужно получить список этих объектов.Когда я вычисляю каждую строку, мне нужно проанализировать ее значения и внести некоторые исправления, если это необходимо.

Вот мой класс 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 раз, поэтому все затронутые строки будут отображаться как измененные в окончательном отчете.Или, может быть, мне нужно переосмыслить всю систему и сделать то, что мне нужно, другим способом?

1 Ответ

0 голосов
/ 21 ноября 2018

Вы должны удалить функциональность связанного списка из вашего класса ReportRow и использовать вместо него класс LinkedList .Этот класс поставляется со встроенными методами для добавления / удаления узлов ( узел - это объект, который содержит одну из ваших строк плюс указатели на предыдущий и следующий) и для перехода к предыдущему и следующему узлу.

...