Générer toutes les combinaisons pour une liste de chaînes de caractères

Je veux générer une liste de toutes les combinaisons possibles d'une liste de chaînes de caractères (c'est en fait une liste d'objets, mais pour des raisons de simplicité, nous allons utiliser des chaînes de caractères). J'ai besoin de cette liste afin que je puisse le tester toutes les combinaisons possibles dans un test unitaire.

Donc par exemple si j'ai une liste de:

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

J'ai besoin d'un List<List<string>> avec toutes les combinaisons comme:

  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...

Une fonction récursive est probablement la façon de faire pour obtenir toutes les combinaisons, mais il semble plus difficile que je l'imaginais.

Les pointeurs?

Merci.

EDIT: deux solutions, avec ou sans récursivité:

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;
    }
}
Je sais que ce n'est pas tout à fait ce que vous recherchez, mais Microsoft a ce système en version bêta qui va automatiquement générer les entrées de combinaisons pour vous. Il est appelé Pex: research.microsoft.com/en-us/projects/pex
A1 A2 == A2 A1 ?
Imaginez un compteur binaire. Cela devrait vous aider à démarrer.
A1 A2 == A2 A1, en effet
Vous n'avez pas besoin de récursivité: stackoverflow.com/questions/10331229/...

OriginalL'auteur L-Four | 2012-05-09