c# - Linq 列表选择的不同结果
问题描述
我有一个简单的方法来计算列表中项目之间的增长。发生了一些奇怪的事情,第一个和第二个转储将显示第一个项目的不同结果。
好 1000/1300/0.3。
差 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;
}
解决方案
这就是你困惑的原因:
var openValue = 1000M;
openValue = item.CloseValue;
在第一次迭代中,您的 openValue 为 1000M。在第一次迭代结束时,将 openValue 设置为列表中最后一项的 closeValue,即 1700M。然后开始新的迭代将为您提供 1700M 的初始 openValue,这导致第一项的值不同。在运行函数之前重置 openValue,你会没事的。
completeItems.Dump();
openValue = 1000M;
completeItems.Dump();
推荐阅读
- java - 如何在 VisualStudioCode 中刷新/同步 gradle 项目
- sapui5 - 在 sap.m.Panel 中绑定分层数据
- c# - struct tostring() 方法正在重定向到抽象类 ValueType
- php - 可以在 webhost 上的 php 中使用命令行吗?
- javascript - 未添加 JQgrid 行
- mysql - 使用 mysql 查询提取字符串的某些部分
- android - 当弹出窗口处于活动状态时,使屏幕变暗,期望选定的视图
- javascript - 如何在允许 Promise 挂起的同时创建待处理的请求列表?
- java - 使用 docx4j 转换 docx 中的 AltChunks
- javascript - 穿透 Z-index