我需要创建一个数字组合列表。这些数字非常小,所以我可以使用 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
的东西,但我不知道如何将其结合起来。
任何建议我都会非常感激。或者,也许这是做我想做的事情最快的方法?
剪辑 有几个要点(很抱歉我没有把这些放在最初的帖子里) :
byte
比用 int
快,我用 保证吧。在内存使用方面,使用67m + 字节数组比使用 int 要好得多ConcurrentBag
)-但是我很高兴被证明是错误的:)结论
Caramiriel has provided a good micro-optimisation which shaves some time off the loops, so I've marked that answer as correct. Eric also mentioned that it is faster to pre-allocate the List. But, at this stage it seems that the nested loops are in fact the fastest possible way of doing this (depressing, I know!).
如果你想尝试我试图用 StopWatch
做的基准测试,那么在每个循环中使用13个循环,每个循环中有4个循环——这样一来,列表中就有6700多万行。在我的机器(i5-3320M 2.6 GHz)上,需要大约2.2秒才能完成优化版本。