Фактическая реализация List<T>
основана на массивах, поэтому разница в использовании памяти между ними будет незначительной.
Что касается IEnumerable<T>
: нет, это не спасет вас. Элементы null
или default
вполне допустимы в IEnumerable<T>
, и инфраструктура ничего не делает для фильтрации дубликатов. Этого не может быть, поскольку объем памяти, связанный со структурой IEnumerable<T>
, полностью зависит от класса, который его реализует, и если вы просто добавляете массив в перечисляемую переменную или поле, вы ничего не меняете. Перечислимые значения также являются неизменяемыми, поэтому предложенное переключение, вероятно, будет серьезным изменением в реализации вашего массива.
Если вы не заботитесь о заказе, вы можете использовать HashSet<T>
. Это на самом деле делает фильтрацию дубликатов, поэтому, если многие или большинство ваших элементов default(T)
, вам потребуется память только для одного из них. Очевидно, что это исключит все дубликаты, а не только дубликаты по умолчанию, поэтому этот выбор будет полезен, только если нет другого дублирования.
Если вам требуется изменяемая семантика - как я подозреваю, если вы используете массивы - тогда вы могли бы (и должны ) переключиться на изменяемый интерфейс, такой как IList<T>
и напишите свою собственную реализацию - вероятно, основанную на List<T>
- которая игнорирует default(T)
, когда вы пытаетесь добавить ее. Таким образом, вы можете сохранить порядок элементов, не являющихся default
, даже не выделяя памяти для хранения элементов default
.
Если вам действительно нужно сохранить всех исходных элементов, то простая структура данных вам не поможет. Могу ли я предложить базу данных? Я знаю, что памяти сейчас много, но когда вы храните сотни тысяч элементов, вы должны быть как минимум , учитывая структуру данных или систему, разработанную для этого масштаба.