Каждый раз, когда мне приходилось использовать перестановки, я использовал этот метод. Он использует оператор с левым сдвигом для повторения всех возможностей. Попробуйте.
private List<List<int>> GetPermutations(List<int> testValues)
{
List<List<int>> result = new List<List<int>>();
for (int count = 0; count < (1 << testValues.Count); ++count)
{
List<int> combinationList= new List<int>();
for (int i = 0; i < testValues.Count; ++i)
{
if ((count & (1 << i)) == 0)
{
combinationList.Add(testValues[i]);
}
}
result.Add(combinationList);
}
return result;
}
Я не знаю, нужно ли быть точно в том порядке, в котором вы писали, что ожидаете. Если вам нужно, чтобы он был в этом порядке, вы должны просто применить linq к списку результатов:)