Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用PLINQ计算和更新机柜内的值不起作用_C#_C# 4.0_Plinq - Fatal编程技术网

C# 使用PLINQ计算和更新机柜内的值不起作用

C# 使用PLINQ计算和更新机柜内的值不起作用,c#,c#-4.0,plinq,C#,C# 4.0,Plinq,我最近需要对一份报告进行一次汇总。其中,对于每个组,我对行进行排序,然后根据组中以前的行计算运行总数。啊哈!我想,这是PLINQ的完美用例 然而,当我编写代码时,我得到了一些奇怪的行为。我正在修改的值在单步执行调试器时显示为正在修改,但当访问它们时,它们始终为零 示例代码: class Item { public int PortfolioID; public int TAAccountID; public DateTime TradeDate; public decimal Share

我最近需要对一份报告进行一次汇总。其中,对于每个组,我对行进行排序,然后根据组中以前的行计算运行总数。啊哈!我想,这是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();
类项目
{
公共叶状体;
公共帐户ID;
公共日期时间交易日期;
公开十进制股份;
公共十进制运行总数;
}
List itemList=新列表
{
新项目
{
叶状体=1,
TAAccountID=1,
TradeDate=新的日期时间(2010,5,1),
股份=533.5万股,
},
新项目
{
叶状体=1,
TAAccountID=1,
TradeDate=新的日期时间(2010年5月2日),
股份=-233.5万股,
},
新项目
{
叶状体=2,
TAAccountID=1,
TradeDate=新的日期时间(2010,5,1),
股份=733.5万股,
},
新项目
{
叶状体=2,
TAAccountID=1,
TradeDate=新的日期时间(2010年5月2日),
股份=-333.5万股,
},
};
var found=(来自itemList中的i)
其中i.TAAccountID==1
选择新项目
{
TAAccountID=i.TAAccountID,
叶状体=i.叶状体,
股份=i.股份,
TradeDate=i.TradeDate,
RunningTotal=0
});
找到.AsParallel().ForAll(x=>
{
var previitems=found.Where(i=>i.PortfolioID==x.PortfolioID
&&i.TAAccountID==x.TAAccountID
&&i.交易日期(s.股份);
});
foreach(发现的项目i)
{
WriteLine(“Running total:{0}”,i.RunningTotal);
}
Console.ReadLine();
如果我将select for found更改为
.ToArray()
,那么它工作正常,并且我得到了计算结果


知道我做错了什么吗?

执行PLINQ查询时,“find”
IEnumerable
尚未完全执行。由于LINQ to对象在默认情况下使用延迟执行,因此在PLINQ查询到达该位置之前,不会创建“Found”的每个元素


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

请尝试正确格式化代码我知道,我在保存时出错,当我查看它时,它没有形成。我只需点击编辑,然后保存,然后神奇地重新格式化