Generieren Sie alle Kombinationen für eine Liste von Zeichenfolgen

Ich möchte eine Liste aller möglichen Kombinationen einer Liste von Zeichenfolgen erstellen (es ist eigentlich eine Liste von Objekten, aber der Einfachheit halber werden wir Zeichenfolgen verwenden). Ich brauche diese Liste, um jede mögliche Kombination in einem Unit-Test testen zu können.

Also zum Beispiel, wenn ich eine Liste von:

<code>  var allValues = new List<string>() { "A1", "A2", "A3", "B1", "B2", "C1" }
</code>

ich brauche einList<List<string>> mit allen kombinationen wie:

<code>  A1
  A2
  A3
  B1
  B2
  C1
  A1 A2
  A1 A2 A3
  A1 A2 A3 B1
  A1 A2 A3 B1 B2
  A1 A2 A3 B1 B2 C1
  A1 A3
  A1 A3 B1
  etc...
</code>

Eine rekursive Funktion ist wahrscheinlich der Weg, um alle Kombinationen zu erhalten, aber es scheint schwieriger zu sein, als ich es mir vorgestellt habe.

Irgendwelche Hinweise?

Vielen Dank.

EDIT: zwei Lösungen mit oder ohne Rekursion:

<code>public class CombinationGenerator<T>
{
    public IEnumerable<List<T>> ProduceWithRecursion(List<T> allValues) 
    {
        for (var i = 0; i < (1 << allValues.Count); i++)
        {
            yield return ConstructSetFromBits(i).Select(n => allValues[n]).ToList();
        }
    }

    private IEnumerable<int> ConstructSetFromBits(int i)
    {
        var n = 0;
        for (; i != 0; i /= 2)
        {
            if ((i & 1) != 0) yield return n;
            n++;
        }
    }

    public List<List<T>> ProduceWithoutRecursion(List<T> allValues)
    {
        var collection = new List<List<T>>();
        for (int counter = 0; counter < (1 << allValues.Count); ++counter)
        {
            List<T> combination = new List<T>();
            for (int i = 0; i < allValues.Count; ++i)
            {
                if ((counter & (1 << i)) == 0)
                    combination.Add(allValues[i]);
            }

            // do something with combination
            collection.Add(combination);
        }
        return collection;
    }
}
</code>

Antworten auf die Frage(4)

Ihre Antwort auf die Frage