Какая из этих двух реализаций GetLargestValue C # лучше и почему? - PullRequest
5 голосов
/ 29 октября 2008

У меня возникли разногласия с кем-то по поводу того, как лучше всего реализовать простой метод, который принимает массив целых чисел и возвращает наибольшее целое число (используя 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;
}

Ответы [ 8 ]

15 голосов
/ 29 октября 2008

Вариант B. Конечно.

А уродлив:

  • Поймать (Исключение) очень плохая практика

  • Вы не должны полагаться на исключение для нулевого ref, вне диапазона, ...

  • Сортировка намного сложнее, чем итерация

Сложность:

  • A будет O (n log (n)) и даже O (n²) в худшем случае

  • В худшем случае O (n)

11 голосов
/ 29 октября 2008

A имеет побочный эффект от сортировки массива. Это может быть неожиданно для звонящего.

Edit: я не люблю возвращать -1 для пустого или нулевого массива (в обоих решениях), поскольку -1 может быть допустимым значением в массиве. Это должно действительно генерировать исключение (возможно, ArgumentException).

5 голосов
/ 29 октября 2008

Второй лучше. Сложность первого - O(N LogN), а второго - O(N).

5 голосов
/ 29 октября 2008

Я предпочитаю Вариант B , поскольку он проходит только один раз.

В Опция A может потребоваться доступ ко многим элементам более одного раза (количество раз зависит от реализации сортировки alogrithm).

Опция A является неэффективной реализацией, но приводит к довольно четкому алгоритму. Однако он использует довольно некрасивую функцию исключения, которая будет срабатывать только при передаче пустого массива (так что, возможно, это можно сделать более понятным с помощью проверки перед сортировкой).

PS, вы никогда не должны просто ловить "Исключение" и затем исправлять вещи. Существует много типов исключений, и, как правило, вы должны ловить каждое возможное и обрабатывать его соответствующим образом.

2 голосов
/ 29 октября 2008

Я должен выбрать вариант B - не то, что он идеален, а потому, что вариант A использует исключения для представления логики.

0 голосов
/ 29 октября 2008

Я вижу две точки здесь:

  1. Тестирование параметров, а не обработка исключений: лучше использовать явную проверку, также должно быть быстрее.
  2. Сортировка и выбор наибольшего значения в отличие от обхода всего массива. Поскольку сортировка включает обработку каждого целого числа в массиве хотя бы один раз , она не будет работать так же хорошо, как обход всего массива (только) один раз.

Что лучше? Для первого пункта, безусловно, явная проверка. Во-вторых, это зависит ...

Первый пример короче, позволяет быстрее писать и читать / понимать. Второе быстрее. Итак: Если эффективность времени выполнения является проблемой, выберите второй вариант. Если ваша цель - быстрое кодирование, используйте первое.

0 голосов
/ 29 октября 2008

Здесь нужно учитывать множество факторов. Обе опции должны включать проверки границ, которые есть в опции B, и исключать использование обработки исключений таким образом. Второй вариант должен работать лучше в большинстве случаев, так как он должен пройти через массив только один раз. Однако, если данные уже были отсортированы или должны быть отсортированы; тогда вариант А будет предпочтительнее.

Никакой алгоритм сортировки не выполняется за n времени, поэтому вариант B будет самым быстрым в среднем.

Редактировать: Статья на сортировку

0 голосов
/ 29 октября 2008

Я бы сказал, что это зависит от вашей цели, скорости или читабельности.

Если ваша цель - скорость обработки, я бы сказал, что второе решение, но если цель - удобочитаемость, я бы выбрал первое.

Я бы, наверное, выбрал скорость для этого типа функции, поэтому я выбрал бы вторую.

...