Инициализация массива С# с несколькими копиями одного и того же элемента
В стандартной библиотеке шаблонов С++ (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, только если оно делает код более удобочитаемым