Генерация всех комбинаций для списка строк
Я хочу создать список всех возможных комбинаций списка строк (фактически это список объектов, но для простоты мы будем использовать строки). Мне нужен этот список, чтобы я мог проверить каждую возможную комбинацию в модульном тесте.
Так, например, если у меня есть список:
<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>