How to get all possible combinations for n arrays with different number of elements?
arrays, c#, combinations
Solution
This works:
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));
So if I have this input:
var input = new []
{
new [] { 1, 2, 3, 4, },
new [] { 6, 7, 5, 2, 1, },
new [] { 22, 4, 6, 8, 4, 8, 5, 4, },
};
I can get the results this way:
var results = f(input);
Here's a version which simply sums the results, as per the request in the comments:
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);
Problem
I have some number of arrays which is unknown at programming time, maybe it is 3 or 4 or 7 ... each array has some elements, i.e, ``` a={1 2 3 4} b={6 7 5 2 1} c={22 4 6 8 4 8 5 4} d={....} e, f, g, ... ``` I want to get get all possible combinations by sampling one number from each array for example one case is that I pick up "1" from a, "7" from b, first "8" from c, d[3], e[5],... to make "1,7,8,d[3],e[5],...". It's not possible to use nested for loops because I don't know the number of arrays at compile time. If it was known for example 4 arrays (a,b,c,d) I could use 4 loops: ``` 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(); } } } } ``` but for different number of arrays, I don't have any idea.