Предполагая, что все элементы в коллекции initail различны , мы можем попытаться использовать Linq для запроса;Обобщим решение:
Код:
public static IEnumerable<T[]> Permutations<T>(IEnumerable<T> source) {
if (null == source)
throw new ArgumentNullException(nameof(source));
T[] data = source.ToArray();
return Enumerable
.Range(0, 1 << (data.Length))
.Select(index => data
.Where((v, i) => (index & (1 << i)) != 0)
.ToArray());
}
Демо:
var data = new char[] { 'A', 'B', 'C' };
var result = Permutations(data);
foreach (var item in result)
Console.WriteLine($"[{string.Join(", ", item)}]);
Результат:
[]
[A]
[B]
[A, B]
[C]
[A, C]
[B, C]
[A, B, C]
Если вы хотите исключить исходный пустой массив, поставьте .Range(1, (1 << (data.Length)) - 1)
вместо .Range(0, 1 << (data.Length))