.NET core 6 在使用 lambda 时抛出算术溢出异常
.NET core 6 throws arithmetic overflow exception when using lambda
为什么只有 miniMaxSum
函数的 lambda 版本会抛出算术溢出异常?
使用 Lambda 编写代码:
void miniMaxSum(List<int> arr)
{
Int64 maxNum = 0;
Int64 minNum = 0;
Int64 min = 0;
Int64 max = 0;
maxNum = arr.Max();
minNum = arr.Min();
min = arr.Where(n => n != maxNum).Sum();
max = arr.Where(n => n != minNum).Sum();
Console.WriteLine($"{min} {max}");
}
List<int> nums = new List<int>{
256741038,
623958417,
467905213,
714532089,
938071625
};
miniMaxSum(nums);
输出:
Unhandled exception. System.OverflowException: Arithmetic operation resulted in an overflow.
at System.Linq.Enumerable.Sum(IEnumerable1 source) at Program.<<Main>$>g__miniMaxSum|0_0(List
1 arr) in /home/gabriel/source/HackerRank/MinMaxSum/Program.cs:line 10
没有 Lambda 的代码:
void miniMaxSum(List<int> arr)
{
Int64 maxNum = 0;
Int64 minNum = 0;
Int64 min = 0;
Int64 max = 0;
maxNum = arr.Max();
minNum = arr.Min();
Int64 aux = 0;
for (int i =0;i <arr.Count;i++)
{
if (arr[i] != maxNum)
{
aux = checked((Int64)(min=min+arr[i]));
min = aux;
}
if (arr[i] != minNum)
{
aux = checked((Int64)(max=max+arr[i]));
max = aux;
}
}
Console.WriteLine($"{min} {max}");
}
List<int> nums = new List<int>{
256741038,
623958417,
467905213,
714532089,
938071625
};
miniMaxSum(nums);
输出:
2063136757 2744467344
谁能解释一下这种行为?
Linq Sum
方法 returns 与您应用它的类型相同,在本例中为 int
,只是因为您将其分配给 long
/Int64
不会改变它,因此它会溢出。解决这个问题的一种方法是将列表项转换为 long
,您可以使用 Select
:
min = arr
.Where(n => n != maxNum)
.Select(x => (long)x)
.Sum();
max = arr
.Where(n => n != minNum)
.Select(x => (long)x)
.Sum();
为什么只有 miniMaxSum
函数的 lambda 版本会抛出算术溢出异常?
使用 Lambda 编写代码:
void miniMaxSum(List<int> arr)
{
Int64 maxNum = 0;
Int64 minNum = 0;
Int64 min = 0;
Int64 max = 0;
maxNum = arr.Max();
minNum = arr.Min();
min = arr.Where(n => n != maxNum).Sum();
max = arr.Where(n => n != minNum).Sum();
Console.WriteLine($"{min} {max}");
}
List<int> nums = new List<int>{
256741038,
623958417,
467905213,
714532089,
938071625
};
miniMaxSum(nums);
输出:
Unhandled exception. System.OverflowException: Arithmetic operation resulted in an overflow.
at System.Linq.Enumerable.Sum(IEnumerable1 source) at Program.<<Main>$>g__miniMaxSum|0_0(List
1 arr) in /home/gabriel/source/HackerRank/MinMaxSum/Program.cs:line 10
没有 Lambda 的代码:
void miniMaxSum(List<int> arr)
{
Int64 maxNum = 0;
Int64 minNum = 0;
Int64 min = 0;
Int64 max = 0;
maxNum = arr.Max();
minNum = arr.Min();
Int64 aux = 0;
for (int i =0;i <arr.Count;i++)
{
if (arr[i] != maxNum)
{
aux = checked((Int64)(min=min+arr[i]));
min = aux;
}
if (arr[i] != minNum)
{
aux = checked((Int64)(max=max+arr[i]));
max = aux;
}
}
Console.WriteLine($"{min} {max}");
}
List<int> nums = new List<int>{
256741038,
623958417,
467905213,
714532089,
938071625
};
miniMaxSum(nums);
输出:
2063136757 2744467344
谁能解释一下这种行为?
Linq Sum
方法 returns 与您应用它的类型相同,在本例中为 int
,只是因为您将其分配给 long
/Int64
不会改变它,因此它会溢出。解决这个问题的一种方法是将列表项转换为 long
,您可以使用 Select
:
min = arr
.Where(n => n != maxNum)
.Select(x => (long)x)
.Sum();
max = arr
.Where(n => n != minNum)
.Select(x => (long)x)
.Sum();