我有某种财务报告,其中每一行都是某个对象,取决于上一个对象。我需要获取这些对象的列表。在计算每一行时,我需要分析其值并在需要时进行一些修复。
这是我的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(next)函数中遇到问题。 如果当前期间的BankRest为负(<0),则需要取消上一个期间的CurrentInvestments(使CurrentInvestments = 0,这会使先前的BankRest变大)。如果这样做没有帮助,我需要向上两步并取消该行的投资。然后检查currentRawBankRest。我需要重复6次。如果将CurrentInvestments设置为先前六个原始值中的0,则无济于事-引发异常。在总报告中,涉及到的所有期间都需要更新。我只修复了前一行,但是我不知道该如何修复5次以上。 这是我的AnalizeAndFix的代码
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次,因此所有受影响的行都会在最终报告中显示更改。 还是我需要重新考虑整个系统并做其他事情需要我做些其他事情?
答案 0 :(得分:2)
您应从ReportRow
类中删除链接列表功能,而应使用the LinkedList class。此类提供了用于添加/删除节点的内置方法(a node是一个对象,其中包含您的行之一以及指向上一个和下一个的指针),并导航到上一个和下一个节点。