Генерация всех комбинаций для списка строк

Я хочу создать список всех возможных комбинаций списка строк (фактически это список объектов, но для простоты мы будем использовать строки). Мне нужен этот список, чтобы я мог проверить каждую возможную комбинацию в модульном тесте.

Так, например, если у меня есть список:

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

мне нужноList<List<string>> со всеми комбинациями, такими как:

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

Рекурсивная функция - это, вероятно, способ сделать это, чтобы получить все комбинации, но это кажется сложнее, чем я себе представлял.

Есть указатели?

Спасибо.

РЕДАКТИРОВАТЬ: два решения, с или без рекурсии:

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

Ответы на вопрос(4)

Ваш ответ на вопрос