gpt4 book ai didi

c# - 使用 PLINQ 计算和更新附件内的值不起作用

转载 作者:行者123 更新时间:2023-11-30 21:21:20 25 4
gpt4 key购买 nike

我最近需要对一份报告进行汇总。对于每个组,我对行进行排序,然后根据组中的前几行计算运行总计。啊哈!我想,这是 PLINQ 的完美用例!

但是,当我编写代码时,出现了一些奇怪的行为。我正在修改的值在单步执行调试器时显示为已修改,但在访问它们时它们始终为零。

示例代码:

class Item
{
public int PortfolioID;
public int TAAccountID;
public DateTime TradeDate;
public decimal Shares;
public decimal RunningTotal;
}

List<Item> itemList = new List<Item>
{
new Item
{
PortfolioID = 1,
TAAccountID = 1,
TradeDate = new DateTime(2010, 5, 1),
Shares = 5.335m,
},
new Item
{
PortfolioID = 1,
TAAccountID = 1,
TradeDate = new DateTime(2010, 5, 2),
Shares = -2.335m,
},
new Item
{
PortfolioID = 2,
TAAccountID = 1,
TradeDate = new DateTime(2010, 5, 1),
Shares = 7.335m,
},
new Item
{
PortfolioID = 2,
TAAccountID = 1,
TradeDate = new DateTime(2010, 5, 2),
Shares = -3.335m,
},

};

var found = (from i in itemList
where i.TAAccountID == 1
select new Item
{
TAAccountID = i.TAAccountID,
PortfolioID = i.PortfolioID,
Shares = i.Shares,
TradeDate = i.TradeDate,
RunningTotal = 0
});

found.AsParallel().ForAll(x =>
{
var prevItems = found.Where(i => i.PortfolioID == x.PortfolioID
&& i.TAAccountID == x.TAAccountID
&& i.TradeDate <= x.TradeDate);
x.RunningTotal = prevItems.Sum(s => s.Shares);
});

foreach (Item i in found)
{
Console.WriteLine("Running total: {0}", i.RunningTotal);
}

Console.ReadLine();

如果我将找到的选择更改为 .ToArray(),那么它工作正常并且我得到计算结果。

知道我做错了什么吗?

最佳答案

当您的 PLINQ 查询执行时,“找到”IEnumerable<T>还没有完全执行。由于 LINQ to Objects 默认情况下使用延迟执行,因此在 PLINQ 查询到达该位置之前不会创建“Found”的每个元素。

由于 ForAll 方法在内部使用 found 执行,因此它会得到一个未执行或仅部分枚举的序列。通过在 .ForAll 调用之前添加 .ToArray() (或 ToList - 基本上,任何强制执行 LINQ to Objects 查询的内容),您将强制执行 LINQ to Objects 查询,从而允许 PLINQ 查询正确执行.

关于c# - 使用 PLINQ 计算和更新附件内的值不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2789672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com