linq 列表总和太大,引发溢出异常

5n0oy7gb  于 2022-12-06  发布在  其他
关注(0)|答案(4)|浏览(191)

我有一个素数列表,最大值为2 000 000。这是一个包含了将近150 000个非常大的整数的列表。我想计算其中所有数的总和。下面是一个随机的大整数列表,只是为了演示:

List<int> numbers = new List<int>();
for (int i = 0; i < 100; i++)
{
    numbers.Add(1000000000);
}
Console.WriteLine(numbers.Sum().ToString());

我得到了一个“算术运算导致溢出”异常。我猜这个和太大了,但是把它转换成Int64没有帮助,它仍然抛出了同样的异常。

Console.WriteLine(Convert.ToUInt64(numbers.Sum()).ToString());

我甚至试着将总和保存到Int64变量中,然后使用它,但这也不起作用。

long sum = numbers.Sum();
Console.WriteLine(sum.ToString());

是否有任何数据类型可以容纳这么大的数字,或者我在其他地方犯了错误?谢谢你的帮助。

wydwbb8l

wydwbb8l1#

在获取sum之前尝试强制转换为Int64(long):

Console.WriteLine(numbers.Select(x=> (long)x).Sum().ToString());
a0zr77ik

a0zr77ik2#

问题是你的答案是超过26.5亿。将int更改为Int64

List<Int64> numbers = new List<Int64>();
for (int i = 0; i < 100; i++)
{
    numbers.Add(1000000000);
}
Console.WriteLine(numbers.Sum().ToString());

澄清一个整数的最大值大约为26.5亿,而Int64的值则是万亿

gdrx4gfi

gdrx4gfi3#

可以使用Aggregate方法:

Console.WriteLine(numbers.Aggregate(0L, (c, n) => c + n));

Aggregate的此重载将累加器作为第一个参数
文字0L将被视为long,而不是int。这将使您免于算术溢出

3mpgtkmj

3mpgtkmj4#

从int到long的转换很便宜,有时甚至是免费的。

long sum = intArr.Select(x => (long)x).Sum(); // 0.95s

long sum = intArr.Sum(x => (long)x); // 0.95s

long sum = longArr.Sum(); // 0.86s

long sum = 0;
foreach (int x in intArr)
{
    sum += x; // 0.22s
}

long sum = 0;
foreach (long x in longArr)
{
    sum += x; // 0.23s
}

如您所见,如果您关心性能,转换不是问题

相关问题