Какая из этих двух реализаций GetLargestValue C# лучше, и почему?

Первый вопрос: хотите ли вы сделать его переносимым через Unix / Windows?

Поскольку каждая ОС имеет определенные атрибуты файла.


Для портативного решения (атрибуты, общие для большинства ОС):

  1. Получите BasicFileAttributes из целевой папки, в которой вы находитесь переход к. Например:

    BasicFileAttributes basicAttr = Files.readAttributes (file, BasicFileAttributes.class);

  2. Установить атрибуты к каждому перемещенному файлу

Для решения для конкретной ОС вместо BasicFileAttributes можно использовать:

  • DosFileAttributes для Windows:

    DosFileAttributes attrs = Files.readAttributes (file, DosFileAttributes.class);

    // Для получения значений атрибутов
    логическое значение isArchive = attrs.isArchive ()
    логическое значение isHidden = attrs.isHidden ()
    логический isReadOnly = attrs.isReadOnly ()
    логический isSystem = attrs.isSystem ()

    // для установки атрибутов в новом файле
    Files.setAttribute (newFile, "dos: archive", isArchive);
    Files.setAttribute (newFile, "dos: hidden", isHidden); [ 1117]
    Files.setAttribute (newFile, "dos: readonly", isReadOnly);
    Files.setAttribute (newFile, "dos: system", isSystem);

    [1122 ]


- Атрибуты PosixFile для Unix

5
задан Joel Coehoorn 3 November 2008 в 15:56
поделиться

8 ответов

Ôption B, конечно.

A ужасен:

  • Выгода (Исключение) является действительно плохой практикой

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

  • Сортировка является путем complexier, чем повторение

Сложность:

  • Желание быть O (n журнал (n)) и даже O (n ²) в худшем случае

  • B худший случай O (n)

15
ответ дан 18 December 2019 в 05:23
поделиться

Побочного эффекта, что это сортирует массив. Это могло бы быть неожиданно вызывающей стороной.

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

11
ответ дан 18 December 2019 в 05:23
поделиться

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

5
ответ дан 18 December 2019 в 05:23
поделиться

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

2
ответ дан 18 December 2019 в 05:23
поделиться

Я предпочитаю Опцию B, поскольку она только пересекает набор точно однажды.

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

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

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

5
ответ дан 18 December 2019 в 05:23
поделиться

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

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

Править: Статья о сортировке

0
ответ дан 18 December 2019 в 05:23
поделиться

Я сказал бы, что это зависит от того, какова Ваша цель, скорость или удобочитаемость.

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

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

0
ответ дан 18 December 2019 в 05:23
поделиться

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

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

Который лучше? Для первой точки, определенно явной проверки. Для второго это зависит...

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

0
ответ дан 18 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: