Какой контейнер C# является самым эффективным с точки зрения ресурсов для существования только для одной операции?

Я часто оказываюсь с ситуацией, где я должен выполнить операцию на ряде свойств. Операция может быть чем-либо от проверки, если особое свойство соответствует чему-нибудь в наборе к единственному повторению действий. Иногда набор динамично сгенерирован, когда функция вызвана, некоторые созданные с простым оператором LINQ, другие времена, это - трудно кодированный набор, который будет всегда оставаться тем же. Но одна константа всегда существует: набор только существует для одной единственной операции и имеет быть бесполезное прежде или после него.

Моя проблема, у меня есть столько точек в моем приложении, где это необходимо, но я, кажется, очень, очень непоследователен в том, как я храню эти наборы. Некоторые из них являются массивами, некоторые - списки, и сейчас я нашел пару связанных списков. Теперь, ни одна из операций, которыми я конкретно обеспокоен, не должна заботиться об индексах, контейнерном размере, порядке или любой другой функциональности, которая даруется любым из отдельных контейнерных типов. Я выбрал эффективность ресурса, потому что это - лучшая идея, чем бросание монеток. Я фигурировал, так как размер массива настроен, и это - очень элементарный контейнер, который мог бы быть моим лучшим выбором, но я полагаю, что это - лучшая идея расспросить тут и там. С другой стороны, если существует лучший выбор не из эффективности ресурса, но строго как являющийся лучшим выбором для этого вида ситуации, которая была бы хороша также.

8
задан Grace Note 14 May 2010 в 14:30
поделиться

3 ответа

С учетом того, что это больше касается согласованности кодирования, а не производительности или эффективности, я думаю, что общей практикой является использование List . Его фактическое резервное хранилище представляет собой массив, поэтому вы на самом деле не теряете много (если что-то заметно) из-за накладных расходов на контейнер. Без дополнительной квалификации я не уверен, что могу предложить что-то большее, чем это.

Конечно, если вы действительно не заботитесь о вещах, которые вы перечисляете в своем вопросе, просто введите свои переменные как IEnumerable , и вы будете иметь дело только с фактическим контейнером, когда вы заселяем; там, где вы его потребляете, будет полностью согласовано.

6
ответ дан 5 December 2019 в 20:14
поделиться

Есть два основных принципа, о которых следует знать в отношении эффективности использования ресурсов.

  • Сложность выполнения
  • Накладные расходы памяти

Вы сказали, что индексы и порядок не имеют значения и что частой операцией является сопоставление. Dictionary (который является hashtable) - идеальный кандидат для такого типа работы. Поиск по ключам выполняется очень быстро, что будет полезно при выполнении операции сопоставления. Недостатком является то, что он будет потреблять немного больше памяти, чем требуется. Обычный коэффициент загрузки составляет около .8, так что речь не идет об огромном увеличении.

Для других операций вы можете найти, что массив или List - лучший вариант, особенно если вам не нужен быстрый поиск. Если вам не требуется высокая производительность при выполнении специальных операций (поиск, сортировка и т.д.), то трудно превзойти общие ресурсные характеристики контейнеров на основе массивов.

2
ответ дан 5 December 2019 в 20:14
поделиться

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

Только если вы обнаружите, что у вас проблемы с процессором или размером памяти, вам следует подумать о повышении «эффективности», и только после определения того, что это является узким местом.

Независимо от того, какой подход вы используете, все равно будет происходить создание и удаление базовых объектов (коллекции или итератора), которые в конечном итоге будут собираться сборщиком мусора, если приложение работает достаточно долго.

0
ответ дан 5 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

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