How can I obtain all the possible combination of a subset?

algorithm, c#, collections, combinations, matrix

Solution

I think, the answers in this question need some performance tests. I'll give it a go. It is community wiki, feel free to update it.

void PerfTest()
{
    var list = Enumerable.Range(0, 21).ToList();

    var t1 = GetDurationInMs(list.SubSets_LB);
    var t2 = GetDurationInMs(list.SubSets_Jodrell2);
    var t3 = GetDurationInMs(() => list.CalcCombinations(20));

    Console.WriteLine("{0}\n{1}\n{2}", t1, t2, t3);
}

long GetDurationInMs(Func<IEnumerable<IEnumerable<int>>> fxn)
{
    fxn(); //JIT???
    var count = 0;

    var sw = Stopwatch.StartNew();
    foreach (var ss in fxn())
    {
        count = ss.Sum();
    }
    return sw.ElapsedMilliseconds;
}

OUTPUT:

1281
1604 (_Jodrell not _Jodrell2)
6817

Jodrell's Update

I've built in release mode, i.e. optimizations on. When I run via Visual Studio I don't get a consistent bias between 1 or 2, but after repeated runs LB's answer wins, I get answers approaching something like,

1190
1260
more

but if I run the test harness from the command line, not via Visual Studio, I get results more like this

987
879
still more

Problem

Consider this `List<string>` ``` List<string> data = new List<string>(); data.Add("Text1"); data.Add("Text2"); data.Add("Text3"); data.Add("Text4"); ``` The problem I had was: how can I get every combination of a subset of the list? Kinda like this: ``` #Subset Dimension 4 Text1;Text2;Text3;Text4 #Subset Dimension 3 Text1;Text2;Text3; Text1;Text2;Text4; Text1;Text3;Text4; Text2;Text3;Text4; #Subset Dimension 2 Text1;Text2; Text1;Text3; Text1;Text4; Text2;Text3; Text2;Text4; #Subset Dimension 1 Text1; Text2; Text3; Text4; ``` I came up with a decent solution which a think is worth to share here.

Original source