.net Enumerable.Sum()在尝试查找超过70000项的总和时没有响应

时间:2014-01-22 07:41:45

标签: .net c#-4.0 foreach sum

我正在测试一个案例场景,我试图找出使用

计算整数列表总和所花费的时间之间的差异
  1. 传统的foreach循环,和
  2. Enumerable.Sum()
  3. 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变量:

    • ForEach计数器的值是-1845002296 [错误]
    • Sum()抛出错误算术运算导致溢出

    长变量:

    • ForEach计数器的值是2449965000 [正确]
    • Sum()仍然抛出相同的错误算术运算导致溢出

1 个答案:

答案 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的最大值。