我有一个简单的方法来计算列表中项目之间的增长。发生了一些奇怪的事情,第一次和第二次转储将显示第一个项目的不同结果。
1000/1300/0.3好。
Bad 1700/1300/-0.23.
void Main()
{
List<TestItem> items = new()
{
new() { EndDate = new DateTime(2020, 3, 31), CloseValue = 1300M },
new() { EndDate = new DateTime(2020, 6, 30), CloseValue = 1600M },
new() { EndDate = new DateTime(2020, 7, 31), CloseValue = 1700M },
};
var openValue = 1000M;
var completeItems =
items.Select(x =>
{
var item = new TestItem
{
EndDate = x.EndDate,
OpenValue = openValue,
CloseValue = x.CloseValue,
};
openValue = item.CloseValue;
return item;
});
completeItems.Dump();
completeItems.Dump();
}
class TestItem
{
public DateTime EndDate { get; set; }
public decimal OpenValue { get; set; }
public decimal CloseValue { get; set; }
public decimal Growth => (OpenValue == 0) ? 0 : (CloseValue - OpenValue) / OpenValue;
}
这里没有什么奇怪的-completeItems
是一个Linq查询,当你调用.Dump()
时,查询被执行然后修改openValue
变量三次,最终赋值为1700M
(在第三次迭代中)。
当您再次调用.Dump()
时,查询再次执行,但现在openValue
有一个"starting"1700M
的值,而不是1000M
。因此,1700M
的结果和第二次转储的负增长。
这就是你困惑的原因:
var openValue = 1000M;
openValue = item.CloseValue;
在第一次迭代中,你的openValue是1000M。在第一次迭代结束时,将openValue设置为列表中最后一项的closeValue,即1700M。然后开始新的迭代将给您一个初始的openValue 1700M,这将导致第一个项目的不同值。在运行函数之前重置openValue,这样就可以了。
completeItems.Dump();
openValue = 1000M;
completeItems.Dump();