.NET Enmumerable.sum()试图找到超过70000个项目的总和时没有响应



我正在测试一个情况下,我试图找出使用

计算整数列表的总和之间所花费的差异
  1. 传统foreach循环和,
  2. 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的最大值。

最新更新