Относительно ответа Pengyang:
Вот моя общая функция, которая может возвращать все комбинации из списка T:
static IEnumerable<IEnumerable<T>>
GetCombinations<T>(IEnumerable<T> list, int length)
{
if (length == 1) return list.Select(t => new T[] { t });
return GetCombinations(list, length - 1)
.SelectMany(t => list, (t1, t2) => t1.Concat(new T[] { t2 }));
}
Пример 1: n = 3, k = 2
IEnumerable<IEnumerable<int>> result =
GetCombinations(Enumerable.Range(1, 3), 2);
Вывод - список целочисленных списков:
{1, 1} {1, 2} {1, 3} {2, 1} {2, 2} {2, 3} {3, 1} {3, 2} {3, 3}
............................................... ..............................
Я использовал этот пример, и я не совсем уверен в правильности результатов.
Пример 2: n = 3, k = 3
IEnumerable<IEnumerable<int>> result =
GetCombinations(Enumerable.Range(1, 3), 3);
Вывод - список целочисленных списков:
{1, 1, 1} {1, 1, 2} {1, 1, 3}
{1, 2, 1} {1, 2, 2} {1, 2, 3}
{1, 3, 1} {1, 3, 2} {1, 3, 3}
{2, 1, 1} {2, 1, 2} {2, 1, 3}
{2, 2, 1} {2, 2, 2} {2, 2, 3}
{2, 3, 1} {2, 3, 2} {2, 3, 3}
{3, 1, 1} {3, 1, 2} {3, 1, 3}
{3, 2, 1} {3, 2, 2} {3, 2, 3}
{3, 3, 1} {3, 3, 2} {3, 3, 3}
Это не должно происходить с комбинациями, в противном случае следует указать, что это повторение. См. Статью http://en.wikipedia.org/wiki/Combinations