Инициализация массива С# с несколькими копиями одного и того же элемента

В стандартной библиотеке шаблонов С++ (STL) можно, например, создать вектор, состоящий из нескольких копий одного и того же элемента, используя этот конструктор:

std::vector<double> v(10, 2.0);

Это создаст вектор из 10 двойников, изначально установленный в 2.0.

Я хочу сделать аналогичную вещь в С#, более конкретно создавая массив из n парных чисел со всеми элементами, инициализированными одним и тем же значением x.

Я придумал следующий однострочный слой, полагающийся на общие коллекции и LINQ:

double[] v = new double[n].Select(item => x).ToArray();

Однако, если аутсайдер прочитает этот код, я не думаю, что сразу будет видно, что на самом деле делает код. Я также обеспокоен производительностью, я полагаю, что было бы быстрее инициализировать элементы массива через цикл for (хотя я еще не проверял). Кто-нибудь знает о более чистом и/или более эффективном способе выполнения этой задачи?

Ответы

Ответ 1

Как насчет этого?

double[] v = Enumerable.Repeat(x, n).ToArray();

РЕДАКТОР: Я просто сделал небольшой тест; для создания 1000 массивов по 100000 элементов каждый, используя цикл примерно в 3 раза быстрее, чем Enumerable.Repeat.

Repeat 
00:00:18.6875488 

Loop 
00:00:06.1628806 

Итак, если производительность критическая, вам следует предпочесть цикл.

Ответ 2

var arr = Enumerable.Repeat(x, n).ToArray();

Лично я бы просто использовал регулярный цикл цикла:

var arr = new double[n];
for(int i = 0 ; i < arr.Length ; i++) arr[i] = x;

Больше символов, но массив явно имеет нужный размер с самого начала - нет итеративного роста List<T> -стиля и окончательной копии. Также; просто более прямой - и JIT может многое сделать для оптимизации шаблона for(int i = 0 ; i < arr.Length ; i++) (для массивов).

Ответ 3

double[] theSameValues = Enumerable.Repeat(2.0, 10).ToArray();

Ответ 4

В VB.NET

Импортирует System.Linq

Dim n As Integer = 10

Dim colorArray = New Color(n - 1) {}.[Select](Function(item) Color.White).ToArray()

Ответ 5

для каждого (или лучше классического для) всегда намного быстрее, чем использование Linq. Вы должны использовать выражение Linq, только если оно делает код более удобочитаемым