Linq列表选择的不同结果



我有一个简单的方法来计算列表中项目之间的增长。发生了一些奇怪的事情,第一次和第二次转储将显示第一个项目的不同结果。

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();

相关内容

  • 没有找到相关文章