有一个自定义class A
,属性为Name
和Amount
有一个嵌套的List A
迭代列表。
为了获得每个唯一的List A
及其总量、计数等,我使用以下代码:`
public void GetStatistic()
{
var result = NestedListofListA.SelectMany(iteration => iteration)
.GroupBy(a => a.Name)
.Select(a => new
{
a.Key,
Count = a.Count(),
Amount = a.Sum(a => a.Amount),
Min = a.Min(a => a.Amount),
Max = a.Max(a => a.Amount)
})
.OrderBy(a => a.key);
}
`问题是,如果嵌套列表计数超过300万次迭代,我会得到
System.OverflowException: 'Arithmetic operation resulted in an overflow.'
Amount
、Min
和Max
在只有300万次迭代的情况下肯定不会超过int.MaxValue
,我不确定是什么导致了问题。
我可以通过从嵌套列表创建一个唯一的a列表来解决这个问题
var uniqueAList = NestedListofA.SelectMany(list => list).DistinctBy(a => a.Name).ToList();
然后使用嵌套的foreach来获得相同的统计数据,但代码更大、更慢
我试图将匿名类属性显式转换为long,以确保问题与之无关,但这对没有帮助
更新:通过以下修复程序,代码正在工作:
Amount = a.Sum(a => (long)a.Amount)
感谢用户@vivek nuna
您必须检查生成的查询。在您的情况下,SUM
溢出。因此,如果不需要,您可以在Amount = a.Sum(a => a.Amount),
行上进行注释。
因此,在像Amount = a.Sum(a => (long)a.Amount
一样将Amount
分配给Amount
之前,将其声明为long
并将其种姓为long
感谢用户@vivek nuna,现在问题解决了:
金额=a.总和(a=>(长)a。金额)