using System; using System.Collections.Generic; using System.Linq; namespace PartitionTest { public static class Partitioning { public static IEnumerable>> GetAllPartitions(T[] elements) { var lists = new List>(); var indexes = new int[elements.Length]; lists.Add(new List()); lists[0].AddRange(elements); for (;;) { yield return lists; int i,index; for (i=indexes.Length-1;; --i) { if (i<=0) yield break; index = indexes[i]; lists[index].RemoveAt(lists[index].Count-1); if (lists[index].Count>0) break; lists.RemoveAt(index); } ++index; if (index >= lists.Count) lists.Add(new List()); for (;i "("+string.Join(",",x)+")"))); } } } }