首页 > 解决方案 > 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;
}

标签: c#linq

解决方案


这就是你困惑的原因:

var openValue = 1000M;    

openValue = item.CloseValue;

在第一次迭代中,您的 openValue 为 1000M。在第一次迭代结束时,将 openValue 设置为列表中最后一项的 closeValue,即 1700M。然后开始新的迭代将为您提供 1700M 的初始 openValue,这导致第一项的值不同。在运行函数之前重置 openValue,你会没事的。

completeItems.Dump();
openValue = 1000M;
completeItems.Dump();

推荐阅读