En supposant que tous les éléments de la collection initail soient distincts , nous pouvons essayer d'utiliser Linq pour interroger ; généralisons la solution :
Code:
public static IEnumerable<T[]> Combinations<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());
}
Démo :
var data = new char[] { 'A', 'B', 'C' };
var result = Combinations(data);
foreach (var item in result)
Console.WriteLine($"[{string.Join(", ", item)}]);
Résultat:
[]
[A]
[B]
[A, B]
[C]
[A, C]
[B, C]
[A, B, C]
Si vous souhaitez exclure le tableau vide initial, mettez .Range(1, (1 << (data.Length)) - 1)
au lieu de .Range(0, 1 << (data.Length))