我正在测试一个情况下,我试图找出使用
计算整数列表的总和之间所花费的差异- 传统foreach循环和,
- enumoserable.sum()
foreach循环更快,但这不是问题。当我尝试找到70000多个项目的总和时,foreach循环正常运行,但是,该代码在总和后没有被执行!我不知道为什么会发生这种情况。以下是我用于测试案例的代码。
List<int> lstInt = GetIntValues();
System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
stopWatch.Start();
int counter = 0;
foreach (int i in lstInt)
{
counter += i;
}
stopWatch.Stop();
lblText.Text = String.Concat("Time elapsed after for-each ", stopWatch.ElapsedMilliseconds);
counter = 0;
stopWatch.Restart();
counter = lstInt.Sum();
stopWatch.Stop();
lblText.Text = String.Concat(lblText.Text, " Time elapsed after linq ", stopWatch.ElapsedMilliseconds);
plz解释了这种异常。
编辑::好的,这里有一些统计
带有int变量:
- 计数器值的值是-1845002296 [错误]
- sum()抛出错误算术操作导致溢出
带有长变量:
- 计数器的次数为2449965000 [正确]
- sum()仍在抛出相同的错误算术操作导致溢出
首先,代码的foreach版本也将与enumoserable.sum()相同的错误,如果在foreach循环中,我替换,
counter += i;
to
counter = checked(counter + i);
提供了计数器变量为INT32类型。
检查的关键字用于明确启用积分型算术操作和转换的溢出检查。更多详细信息
其次,即使我将计数器从int更改为long,我也会遇到相同的错误。这是因为事实是,执行总和操作的列表为INT32!
所以,当我更改时,
counter = lstInt.Sum();
to
counter = list.Select(i => (long)i).Sum();
错误消失了。
简而言之,整个问题是因为分配给计数变量的总和值[]超过了INT32的最大值。