Мне нужно создать список комбинаций чисел. Числа довольно малы, поэтому я могу использовать byte
, а не int
. Однако для получения каждой возможной комбинации требуется много вложенных циклов. Мне интересно, есть ли более эффективный способ сделать то, что мне нужно. Код до сих пор:
var data = new List<byte[]>();
for (byte a = 0; a < 2; a++)
for (byte b = 0; b < 3; b++)
for (byte c = 0; c < 4; c++)
for (byte d = 0; d < 3; d++)
for (byte e = 0; e < 4; e++)
for (byte f = 0; f < 3; f++)
for (byte g = 0; g < 3; g++)
for (byte h = 0; h < 4; h++)
for (byte i = 0; i < 2; i++)
for (byte j = 0; j < 4; j++)
for (byte k = 0; k < 4; k++)
for (byte l = 0; l < 3; l++)
for (byte m = 0; m < 4; m++)
{
data.Add(new [] {a, b, c, d, e, f, g, h, i, j, k, l, m});
}
Я рассматривал возможность использования чего-то вроде BitArray
, но я не уверен, как его включить.
Любые рекомендации будут высоко оценены. Или, возможно, это самый быстрый способ сделать то, что я хочу?
ИЗМЕНИТЬ Пара быстрых точек (и извинения, которые я не помещал в исходное сообщение):
- Числа и порядок их (2, 3, 4, 3, 4, 3, 3 и т.д.) очень важны, поэтому с помощью решения, такого как Создание перестановок с использованием LINQ не поможет, потому что максимальные значения в каждом столбце отличаются друг от друга.
- Я не математик, поэтому прошу прощения, если я не использую такие технические термины, как "перестановки" и "комбинации":)
- я do необходимо заполнить все эти комбинации сразу - я не могу просто захватить тот или иной на основе индекса
- Использование
byte
выполняется быстрее, чем при использованииint
, я гарантирует его. Также намного лучше использовать память, чтобы иметь 67m + массивы байтов, а не ints - Моя конечная цель - искать более быструю альтернативу вложенным циклам.
- Я рассматривал использование параллельного программирования, но из-за итеративного характера того, что я пытаюсь достичь, я не смог найти способ сделать это успешно (даже с
ConcurrentBag
) - однако я счастлив быть оказалось не так:)
Заключение
Caramiriel обеспечил хорошую микро-оптимизацию, которая бреет некоторое время от циклов, поэтому я отметил этот ответ как правильный. Эрик также упомянул, что быстрее предварительно выделить список. Но на данном этапе кажется, что вложенные петли на самом деле являются самым быстрым способом сделать это (удручающе, я знаю!).
Если вы хотите попробовать точно, что я пытался сравнить с StopWatch
, перейдите с 13 циклами, насчитывающими до 4 в каждом цикле, что составляет около 67 м + строк в списке. На моей машине (i5-3320M 2,6 ГГц) для оптимизации оптимизатора требуется 2,2 с.