先简单说两句一下
由于会得到所有的候选参数的组合结果,笛卡尔积通常会得到很大的数据量,实现算法的时候应该用迭代器可以减少内存。同时也可以避免结果数据过多超过整数范围的情况。
例如我们候选有32个变量每个变量有2个候选,那么结果会是2的32次方个,如果全部存起来是很恐怖的内存消耗。
代码
public static IEnumerable<T[]> DescartesProductYield<T>(T[][] options)
{
var oplen = options.Length;//方便敲代码
T[] tmp = new T[oplen];
//每个参数索引记录
int[] idxs = new int[oplen];
int i = 0;
while (i < oplen)
{
tmp[i] = options[i][idxs[i]];
if (i == oplen - 1)
{
yield return tmp;
for (int j = oplen - 1; j >= 0; j--)
{
idxs[j]++;
if (j == 0 && idxs[j] == options[0].Length)
{
yield break;
}
if (idxs[j] < options[j].Length)
{
i = j - 1;
break;
}
else
{
idxs[j] = 0;
}
}
}
i++;
}
}