我正在测试一个案例场景,我试图找出使用
计算整数列表总和所花费的时间之间的差异foreach循环更快,但这不是问题。当我试图找到超过70000个项目的总和时,foreach循环正在按预期运行,但是,在Sum之后代码没有被执行!我不知道为什么会这样。下面是我用于测试用例的代码。
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解释这个异常现象。
EDIT :: 好的,这里有一些统计数据
使用int变量:
长变量:
答案 0 :(得分:0)
首先,代码的foreach版本也会抛出与Enumerable.Sum()相同的错误,如果在foreach循环中,我替换,
counter += i;
到
counter = checked(counter + i);
如果计数器变量的类型为Int32。
checked关键字用于显式启用整数类算术运算和转换的溢出检查。 More Details
其次,即使我将计数器从int更改为long,我也会为Enumerable.Sum()获得相同的错误。这是因为正在执行Sum操作的List是Int32!
类型的事实所以,当我改变时,
counter = lstInt.Sum();
到
counter = list.Select(i => (long)i).Sum();
错误消失了。
简而言之,整个问题是因为总和值[分配给计数器变量]超过了Int32的最大值。