这两个GetLargestValue C#实现中哪一个更好,为什么?

MrC*_*eri 5 .net c# .net-2.0

我对如何最好地实现一个采用整数数组的简单方法并返回最高整数(使用C#2.0)的人有不同意见.

以下是两个实现 - 我有自己的看法哪个更好,为什么,但我会感谢任何公正的意见.

选项A.

public int GetLargestValue(int[] values)
{
   try  {
          Array.Sort(values);
          return values[values.Length - 1];
        }
   catch (Exception){ return -1;}
}
Run Code Online (Sandbox Code Playgroud)

选项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;
}
Run Code Online (Sandbox Code Playgroud)

Fra*_*ois 15

当然是B.

A很难看:

  • Catch(Exception)是一个非常糟糕的做法

  • 你不应该依赖null ref的异常,超出范围,......

  • 排序比迭代更复杂

复杂性:

  • 在最坏的情况下,A将是O(n log(n))并且甚至是O(n 2)

  • B最坏的情况是O(n)


Jac*_*esB 11

A有副作用,它对数组进行排序.调用者可能会意外.

编辑:我不想为空或空数组返回-1(在两个解决方案中),因为-1可能是数组中的合法值.这应该真的产生一个异常(也许ArgumentException).


小智 5

我更喜欢选项B,因为它只遍历集合一次.

选项A中,您可能不得不多次访问许多元素(次数取决于排序算法的实现).

选项A是inefficent实现,但导致了相当明确的算法.然而它确实使用了一个相当丑陋的异常捕获,只有在传入一个空数组时才会触发(因此可能会通过预排序检查更清晰地写出来).

PS,你永远不应该只是捕捉"异常",然后纠正的事情.有许多类型的例外,通常你应该抓住每个可能的例外并相应地处理.


Sha*_*bie 5

第二个更好.第一个的复杂性是O(N LogN),第二个是复杂的O(N).