C# 求绝对数的最大值

C# 求绝对数的最大值,c#,arrays,max,C#,Arrays,Max,有没有什么快速的方法可以将数组的所有成员转换为绝对值并找到其中的最大数? 例如,在此阵列中: -100 25 43 最大值是43,但我想从我的代码中得到100。是否有任何简单/快速的方法,我可以用来找到最大值,而不管它的符号是什么?或者我必须使用for循环将所有数组成员转换为绝对值,然后在其中找到最大值吗?这样做: var numbers = new[] { -100, 25, 43 }; var absoluteMax = numbers.Select(x => Math.Abs(x)

有没有什么快速的方法可以将数组的所有成员转换为绝对值并找到其中的最大数? 例如,在此阵列中:

-100 25 43

最大值是43,但我想从我的代码中得到100。是否有任何简单/快速的方法,我可以用来找到最大值,而不管它的符号是什么?或者我必须使用for循环将所有数组成员转换为绝对值,然后在其中找到最大值吗?

这样做:

var numbers = new[] { -100, 25, 43 };

var absoluteMax = numbers.Select(x => Math.Abs(x)).Max();
我按要求获得
100

如果您的一个数字是
int.MinValue
,那么您会得到一个
OverflowException
-“对两个补码的最小值求反无效。”

此操作:

var numbers = new[] { -100, 25, 43 };

var absoluteMax = numbers.Select(x => Math.Abs(x)).Max();
我按要求获得
100

如果您的一个数字是
int.MinValue
,则会得到一个
OverflowException
-“对两个补码的最小值求反无效。”

尝试以下操作:

int[] array = {-100, 25, 43};
int max = array.Select(Math.Abs).Max();
试试这个:

int[] array = {-100, 25, 43};
int max = array.Select(Math.Abs).Max();

好好想想。你有一个数字列表。您需要找到(绝对)最大值。你能想出一种不用全部检查就能找到最大值的方法吗?如果您检查前2个,您是否可以自信地得出结论,您找到了最大值,而不检查数组的其余部分?你不能。因此,您需要检查每个数字


一个基本的
for
循环就可以了。你没有比循环更好的方法了。当然,您可以使用LINQ或其他API对您隐藏循环,但从根本上说,它们就是这样做的。

我们好好想想。你有一个数字列表。您需要找到(绝对)最大值。你能想出一种不用全部检查就能找到最大值的方法吗?如果您检查前2个,您是否可以自信地得出结论,您找到了最大值,而不检查数组的其余部分?你不能。因此,您需要检查每个数字


一个基本的
for
循环就可以了。你没有比循环更好的方法了。当然,您可以使用LINQ或其他API对您隐藏循环,但从根本上说,它们就是这样做的。

如果其中一个值是int.MinValue,会发生什么?所发生的事情是否符合预期行为?谢谢@EricLippert。这些年来我从你身上学到了很多。但请不要让我对我的编码过于偏执。;-)我想你只是想变得多疑而已。:-)事实上,我在这里指出的问题并不是你的逻辑是错误的,而是问题本身没有明确说明。非常感谢@Enigmativity:)这是在内存中创建一个中间列表。这在性能上是否具有可比性:返回最大值(abs(list.min)、abs(list.Max))?如果其中一个值为int.MinValue,会发生什么情况?所发生的事情是否符合预期行为?谢谢@EricLippert。这些年来我从你身上学到了很多。但请不要让我对我的编码过于偏执。;-)我想你只是想变得多疑而已。:-)事实上,我在这里指出的问题并不是你的逻辑是错误的,而是问题本身没有明确说明。非常感谢@Enigmativity:)这是在内存中创建一个中间列表。这在性能上是否具有可比性:返回最大值(abs(list.min)、abs(list.Max))?假设其中一个值为int.MinValue。它没有适合int的绝对值。在这种情况下,您应该说明您想要的行为。假设其中一个值是int.MinValue。它没有适合int的绝对值。在这种情况下,你应该说明你想要什么行为。是的,你是对的,LINQ做同样的事情,但我正在寻找一个清晰的方法,所以我不必为它编写(可能)低效的代码。是的,你是对的,LINQ做同样的事情,但我正在寻找一个清晰的方法,因此,我不必为它编写(可能)低效的代码。显然
Select
Max
扩展方法只是执行for循环的一种简洁方法。显然
Select
Max
扩展方法只是执行for循环的一种简洁方法。