Автоматическая инициализация списков C #

Я создаю новый список C # (List<double>). Есть ли способ, кроме как сделать цикл по списку, чтобы инициализировать все начальные значения в 0?

 DevelopingChris09 июл. 2009 г., 17:06
это выполнимо, но списки в .net не имеют определенного размера, так что это своего рода точки

Ответы на вопрос(6)

Enumerable.Range:

int capacity;
var list = Enumerable.Range(0, capacity).Select(i => 0d).ToList();

Другой это:

int capacity;
var list = new List<double>(new double[capacity]);
 09 июл. 2009 г., 17:09
Это больше похоже на него.
 09 июл. 2009 г., 17:24
Это хорошо, потому что второй пример можно использовать в C # 2.0.

Enumerable.Repeat(0d, 25).ToList();
new List<double>(new double[25]);     //Array elements default to 0
 09 июл. 2009 г., 17:32
Первым должно быть var list = Enumerable.Repeat (0d, 25) .ToList ();
 09 июл. 2009 г., 17:07
Я думаю, что это больше, чем ищет ОП.

List<Customer> listOfCustomers =
        new List<Customer> {
            { Id = 1, Name="Dave", City="Sarasota" },
            { Id = 2, Name="John", City="Tampa" },
            { Id = 3, Name="Abe", City="Miami" }
        };

отсюда:Блог Дэвида Хейдена

 09 июл. 2009 г., 17:17
это не дает никакой помощи в работе со значениями по умолчанию для двойников.

var listInt = new List<int> {4, 5, 6, 7};
var listString = new List<string> {"string1", "hello", "world"};
var listCustomObjects = new List<Animal> {new Cat(), new Dog(), new Horse()};

Таким образом, вы могли бы использовать это:

var listInt = new List<double> {0.0, 0.0, 0.0, 0.0};

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

 09 июл. 2009 г., 17:19
Имейте в виду, что это будет работать только в VS2008 / C # 3 / VB9, а не в более ранних версиях (VS2005 / C # 2 / VB8)
 09 июл. 2009 г., 17:13
& quot; В противном случае, используя конструктор по умолчанию, список будет инициализирован 0 элементами. & quot; Чтобы было ясно, список будет пустым, не то чтобы в нем были все записи со значением по умолчанию.
 09 июл. 2009 г., 17:27
Ну, это правильно ... Я просто предположил это, потому что он упомянул C # List, а не ArrayList или что-то в этом роде; но стоит упомянуть об этом
 09 июл. 2009 г., 17:14
Извините ... мой английский не очень хорошо

Используя LINQ, попробуйте

var initializedList = new double[10].ToList()

... надеюсь, избежать копирования списка (теперь это до LINQ).

Это должно быть комментарием к Michael Meadows & apos; ответ, но мне не хватает репутации.

Решение Вопроса

ем статических методов наEnumerable класс), вы можете передать массивdoubleс в конструкторе.

var tenDoubles = new List<double>(new double[10]);

Это работает, потому что значение по умолчаниюdouble уже 0, и, вероятно, работает немного лучше.

 09 июл. 2009 г., 22:01
Очень умное и эффективное решение.
 09 июл. 2009 г., 18:02
Я подозреваю, что на самом деле это будет немного хуже.List<T> Конструктор копирует свой массив, поэтому этот метод выделяет два массива. Метод LINQ использует итератор без выделения большого количества памяти. С другой стороны, присвоение ему массива позволит ему использовать правильный размер, что сохранит изменение размера массива, если имеется больше элементов, чем емкость по умолчанию дляList<T>, (8, IIRC)
 17 авг. 2014 г., 08:50
Помните, что для больших списков это не рекомендуется, поскольку вы инициализируете два массива из 10 (новый double [10] сгенерирует 10 double, а List & lt; double & gt; будет копировать его внутренне). Для 10 это хорошо, но, скажем, вам нужно было инициализировать массив из 1e6 элементов, чем в конечном итоге потребовалось бы в 2 раза больше времени / памяти для этого.
 09 июл. 2009 г., 20:52
@SLaks, интересный момент. Я полагаю, вы правы. Это, вероятно, зависит от первоначального размера. Для меньших начальных размеров функциональный подход, вероятно, немного более эффективен, где большие начальные размеры определенно будут работать лучше с инициализатором массива. В конце, тем не менее, я полагаю, что утверждение о производительности, вероятно, в лучшем случае является академическим, так как оно, вероятно, никогда не будет иметь значения в реальном производственном приложении.
 17 июл. 2013 г., 23:02
Это немного отходит от вопроса, но я думаю, что это может быть полезно для некоторых из тех, кто изначально приходит на этот вопрос за помощью. Вы можете изменить емкость списка в любое время, чтобы максимизировать эффективность. NameOfList.Capacity = 5000; // устанавливает размер списка равным 5000 без фактического добавления или удаления из списка.

Ваш ответ на вопрос