我与某人就如何最好地实现一个采用整数数组的简单方法并返回最高整数(使用C#2.0)存在分歧。
下面是两个实现 - 我有自己的看法哪个更好,为什么,但我会感谢任何公正的意见。
选项A
public int GetLargestValue(int[] values)
{
try {
Array.Sort(values);
return values[values.Length - 1];
}
catch (Exception){ return -1;}
}
选项B
public int GetLargestValue(int[] values)
{
if(values == null)
return -1;
if(values.Length < 1)
return -1;
int highestValue = values[0];
foreach(int value in values)
if(value > highestValue)
highestValue = value;
return highestValue;
}
答案 0 :(得分:15)
ÔB当然。
A很难看:
Catch(Exception)是一个非常糟糕的做法
你不应该依赖null ref,超出范围,......
排序比迭代更复杂
复杂性:
在最坏的情况下,A将是O(n log(n))甚至是O(n²)
B最坏的情况是O(n)
答案 1 :(得分:11)
A有副作用,它对数组进行排序。调用者可能会意外。
编辑:我不喜欢为空或空数组返回-1(在两个解决方案中),因为-1可能是数组中的合法值。这应该会产生一个异常(也许是ArgumentException
)。
答案 2 :(得分:5)
我更喜欢选项B ,因为它只遍历集合一次。
在选项A 中,您可能不得不多次访问多个元素(次数取决于排序算法的实现)。
选项A 是一种无效的实现,但会产生相当清晰的算法。然而它确实使用了一个相当丑陋的异常捕获,只有在传入一个空数组时才会触发(因此可能会通过预排序检查更清晰地写出来)。
PS,你永远不应该只是抓住“异常”然后纠正事情。有许多类型的例外,通常你应该抓住每个可能的例外并相应地处理。答案 3 :(得分:5)
第二个更好。
第一个的复杂度为O(N LogN)
,第二个的复杂度为O(N)
。
答案 4 :(得分:2)
我必须选择选项B - 不是因为它是完美的,而是因为选项A使用异常来表示逻辑。
答案 5 :(得分:0)
我想说这取决于你的目标是什么,速度还是可读性。
如果处理速度是你的目标,我会说第二个解决方案,但如果可读性是目标,我会选择第一个。
我可能会为这种类型的功能寻求速度,所以我会选择第二种功能。
答案 6 :(得分:0)
这里有许多因素需要考虑。这两个选项都应该包含选项B中的边界检查,并以这种方式使用异常处理。第二个选项应该在大多数时间内表现更好,因为它只需要遍历一次数组。但是,如果数据已经排序或需要排序;那么选项A将是更可取的。
没有排序算法在 n 时间内执行,因此选项B的平均速度最快。
答案 7 :(得分:0)
我在这里看到两点:
哪个更好?对于第一点,绝对明确的检查。对于第二个,它取决于......
第一个例子更短,可以更快地编写和阅读/理解。第二个更快。所以:如果运行时效率是个问题,请选择第二个选项。如果您的目标是快速编码,请使用第一个。