Форсирование / Требование Аргумента Сортированного Списка для Метода

Предположим, что был написан метод, который ожидает отсортированный список как один из его входных данных. Конечно, это будет прокомментировано и задокументировано в коде, param будет называться "sortedList", но если кто-то забудет, тогда будет ошибка.

Есть ли способ заставить FORCE вход должен быть отсортирован? Я думал о создании нового класса объектов со списком и логическим "отсортированным", и переданный объект должен быть этим объектом, а затем метод немедленно проверяет, является ли "отсортированный" логическим значением true. Но я чувствую, что должен быть лучший / стандартный способ.

* Этот метод вызывается в цикле, поэтому не нужно сортировать внутри метода.

3 ответа

Решение

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

Другой вариант, который у вас есть, - просто отсортировать данные после их получения, вместо того чтобы требовать, чтобы вызывающий абонент сортировал данные. Обратите внимание, что для большинства распространенных алгоритмов сортировки сортировка уже отсортированного набора данных является наилучшей скоростью (обычно O(n) вместо O(n*log(n))), поэтому даже если набор данных иногда уже отсортирован, а иногда нет это не обязательно ужасно, если у вас нет огромного набора данных.

Сначала давайте ответим на вопрос, заданный здесь.

Есть ли способ заставить FORCE вход должен быть отсортирован?

Ну да и нет. Вы можете указать, что вам нужна одна из структур данных в.NET, которая имеет порядок сортировки. С другой стороны, нет, вы не можете указать, что он использует порядок сортировки, который вас интересует. Таким образом, он может быть отсортирован по случайному числу, которое будет таким же, как "несортированный" (вероятно) в вашем контексте.

Позвольте мне остановиться на этом. Вы не можете объявить тип или метод с требованием, чтобы компилятор мог проверить, что данные, передаваемые в метод, отсортированы в соответствии с некоторыми правилами, которые вы определили. Там просто нет синтаксиса, который позволит вам объявить такое требование. Вы либо должны доверять вызывающему коду для правильной сортировки данных, либо нет.

Так что у тебя осталось?

Мой совет - создать метод, в котором вызывающий код скажет вам, что данные были отсортированы в соответствии с некоторыми предварительно определенными требованиями для вызова этого метода. Если вызывающий абонент сказал "нет, я не могу или не могу гарантировать, что данные находятся в таком порядке сортировки", то вам придется сортировать их самостоятельно.

Помимо этого вы можете создать свою собственную структуру данных, которая будет подразумевать правильный тип сортировки.

Можно выражать и применять такие ограничения в более мощных системах типов, но не в системе типов C# или.NET. Вы можете пометить коллекцию каким-либо образом, как вы предложили, но это не гарантирует, что коллекции действительно отсортированы. Вы можете использовать логический флаг, как вы предложили, или специальный класс или интерфейс.

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

Другой вариант будет использовать алгоритм сортировки, который работает в O(n) в отсортированном списке и просто сортировать коллекцию каждый раз. Это не увеличит накладные расходы в случае, если список действительно уже отсортирован, но все равно будет работать, если это не так. У сортировки вставок есть обязательное свойство для запуска O(n) в отсортированном списке. Bubble sort тоже имеет свойство, но в других случаях он действительно медленный.

Другие вопросы по тегам