Как инициализировать Список <T> к данному размеру (в противоположность способности)?

99
задан Félix LD 20 August 2015 в 21:44
поделиться

8 ответов

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

public static class Lists
{
    public static List<T> RepeatedDefault<T>(int count)
    {
        return Repeated(default(T), count);
    }

    public static List<T> Repeated<T>(T value, int count)
    {
        List<T> ret = new List<T>(count);
        ret.AddRange(Enumerable.Repeat(value, count));
        return ret;
    }
}

Вы могли использование Enumerable.Repeat(default(T), count).ToList(), но это будет неэффективно должное буферизовать изменение размеров.

РЕДАКТИРОВАНИЕ: Как отмечено в комментариях, Вы могли заставить Repeated использовать цикл для заполнения списка, если бы Вы хотели. Это было бы немного быстрее также. Лично я нахожу код с помощью Repeat более описательный, и подозреваю, что в реальном мире различие в производительности было бы не важно, но пробег может варьироваться.

72
ответ дан Jon Skeet 24 November 2019 в 05:00
поделиться

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

Dictionary<int, string> foo = new Dictionary<int, string>();
foo[2] = "string";
4
ответ дан Greg D 24 November 2019 в 05:00
поделиться
string [] temp = new string[] {"1","2","3"};
List<string> temp2 = temp.ToList();
1
ответ дан Mong Zhu 24 November 2019 в 05:00
поделиться

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

5
ответ дан Welbog 24 November 2019 в 05:00
поделиться

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

, Когда Вы делаете это:

List<int> = new List<int>(100);

Вы создаете список, способность которого является 100 целыми числами. Это означает, что Ваш Список не должен будет 'расти', пока Вы не добавите 101-й объект. Основной массив списка будет инициализирован с длиной 100.

6
ответ дан Frederik Gheysels 24 November 2019 в 05:00
поделиться

Используйте конструктора, который берет интервал ("качество") аргумента:

List<string> = new List<string>(10);

РЕДАКТИРОВАНИЕ: Я должен добавить, что соглашаюсь с Frederik. Вы используете Список способом, который идет вразрез со всем обоснованием позади использования его во-первых.

EDIT2:

РЕДАКТИРОВАНИЕ 2: То, что я в настоящее время пишу, является базовым классом, предлагающим функциональность по умолчанию как часть большей платформы. В функциональности по умолчанию я предлагаю, размер Списка известен в усовершенствованном, и поэтому я, возможно, использовал массив. Однако я хочу предложить любому базовому классу шанс динамично расширить его, и поэтому я выбираю список.

, Почему кто-либо должен был бы знать размер Списка со всеми нулевыми значениями? Если бы нет никаких действительных значений в списке, я ожидал бы, что длина будет 0. Во всяком случае то, что это - cludgy, демонстрирует, что он идет вразрез с надлежащим использованием класса.

22
ответ дан Ed S. 24 November 2019 в 05:00
поделиться
List<string> L = new List<string> ( new string[10] );
114
ответ дан 24 November 2019 в 05:00
поделиться

Если Вы хотите инициализировать список с элементами N некоторого фиксированного значения:

public List<T> InitList<T>(int count, T initValue)
{
  return Enumerable.Repeat(initValue, count).ToList();
}
4
ответ дан Amy B 24 November 2019 в 05:00
поделиться
Другие вопросы по тегам:

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