Получение всех возможных комбинаций из списка номеров

Я ищу эффективный способ добиться этого:

В принципе, внутри группы порядок не имеет значения, поэтому {1,2,3} эквивалентен {1,3,2} – это просто вопрос получения всех групп из x чисел из этого списка

Похоже, для этого должен быть простой алгоритм, но до сих пор я тщетно искал. Большинство комбинаторика и алгоритмы перестановок, по-видимому, а) учитывают порядок (например, 123 не равны 132), и они всегда работают на одной строке символов или чисел ….

У кого-нибудь есть отличный, красивый алгоритм в armве?

Благодаря!

Просто увеличьте двоичное число и возьмите элементы, соответствующие установленным битам.

Например, 00101101 будет означать, чтобы взять элементы с индексами 0, 2, 3 и 5. Так как ваш список равен просто 1..n, этот элемент является просто индексом + 1.

Это создаст перестановки в порядке. Другими словами, будет генерироваться только {1, 2, 3} . Не {1, 3, 2} или {2, 1, 3} или {2, 3, 1} и т. Д.

Не мой код, но вы ищете poweret. Google дал мне это решение, которое, похоже, работает:

 public IEnumerable> GetPowerSet(List list) { return from m in Enumerable.Range(0, 1 << list.Count) select from i in Enumerable.Range(0, list.Count) where (m & (1 << i)) != 0 select list[i]; } 

Источник: http://rosettacode.org/wiki/Power_set#C.23

Это то, что я написал в прошлом, чтобы выполнить такую ​​задачу.

 List CreateSubsets(T[] originalArray) { List subsets = new List(); for (int i = 0; i < originalArray.Length; i++) { int subsetCount = subsets.Count; subsets.Add(new T[] { originalArray[i] }); for (int j = 0; j < subsetCount; j++) { T[] newSubset = new T[subsets[j].Length + 1]; subsets[j].CopyTo(newSubset, 0); newSubset[newSubset.Length - 1] = originalArray[i]; subsets.Add(newSubset); } } return subsets; } 

Он общий, поэтому он будет работать для ints, longs, strings, Foos и т. Д.

Давайте будем гением компьютера.