如何获得具有不同数量元素的n个数组的所有可能组合?

use*_*337 9 c# arrays combinations

我有一些在编程时未知的数组,可能是3或4或7 ...每个数组都有一些元素,即

a={1 2 3 4}
b={6 7 5 2 1}
c={22 4 6 8 4 8 5 4}
d={....}
e, f, g, ...
Run Code Online (Sandbox Code Playgroud)

我希望通过从每个数组中抽取一个数字来获得所有可能的组合,例如一种情况是我从a中选择"1",从b中获取"7",从c获得第一个"8",d [3],e [ 5],......制作"1,7,8,d [3],e [5],......".不可能使用嵌套的for循环,因为我不知道编译时的数组数.如果已知例如4个数组(a,b,c,d),我可以使用4个循环:

for (int i = 0; i <= a.Length-1; i++)
{
   for (int j = 0; i <= b.Length-1; j++)
   {
      for (int k = 0; i <= c.Length-1; k++)
      {
         for (int m = 0; i <= d.Length-1; m++)
         {
            Response[f++] = a[i].toString()+","+b[j].toString()+","+c[k].toString()+","+d[m].toString();
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

但是对于不同数量的阵列,我什么都不知道.

Eni*_*ity 8

这有效:

Func<
    IEnumerable<IEnumerable<int>>,
    IEnumerable<IEnumerable<int>>> f0 = null;
f0 = xss =>
{
    if (!xss.Any())
    {
        return new [] { Enumerable.Empty<int>() };
    }
    else
    {
        var query =
            from x in xss.First()
            from y in f0(xss.Skip(1))
            select new [] { x }.Concat(y);
        return query;
    }
};

Func<IEnumerable<IEnumerable<int>>, IEnumerable<string>> f =
    xss => f0(xss).Select(xs => String.Join(",", xs));
Run Code Online (Sandbox Code Playgroud)

所以,如果我有这个输入:

var input = new []
{
    new [] { 1, 2, 3, 4, },
    new [] { 6, 7, 5, 2, 1, },
    new [] { 22, 4, 6, 8, 4, 8, 5, 4, },
};
Run Code Online (Sandbox Code Playgroud)

我可以这样得到结果:

var results = f(input);
Run Code Online (Sandbox Code Playgroud)

结果


根据评论中的请求,这是一个简单总结结果的版本:

Func<IEnumerable<IEnumerable<int>>, IEnumerable<int>> f = null;
f = xss =>
{
    if (!xss.Any())
    {
        return new [] { 0 };
    }
    else
    {
        var query =
            from x in xss.First()
            from y in f(xss.Skip(1))
            select x + y;
        return query;
    }
};

var input = new []
{
    new [] { 1, 2, 3, 4, },
    new [] { 6, 7, 5, 2, 1, },
    new [] { 22, 4, 6, 8, 4, 8, 5, 4, },
};

var results = f(input);
Run Code Online (Sandbox Code Playgroud)