c# комбинаторика, уникальная позиция

Мой код генерирует комбинации. Подскажите как с помощью LINQ можно убрать комбинации, позиция которых повторяется? Пример на цифрах

Такой результат я ожидаю:

1 2 3
2 3 1
3 1 2


public static IEnumerable<IEnumerable<T>> GetPermutations<T>(IEnumerable<T> items, int count)
{
    int i = 0;
    foreach (var item in items)
    {
        if (count == 1)
            yield return new T[] { item };
        else
        {
            foreach (var result in GetPermutations(items.Except(new[] { item }), count - 1))
                yield return new T[] { item }.Concat(result);
        }

        ++i;
    }
}
Результат моего кода:
1 2 3
1 3 2
и т.д

Ответы (2 шт):

Автор решения: tym32167

Во первых, у вас не все комбинации, а только все сдвиги.

Для генерации подобного нет необходимости в рекурсии, вот пример

var data = new int[] { 1, 2, 3 };

var items = data.Select((d, i) => data.Concat(data).Skip(i).Take(data.Length));

Console.WriteLine(string.Join(Environment.NewLine, items.Select(x => string.Join(" ", x))));

Вывод

1 2 3
2 3 1
3 1 2
→ Ссылка
Автор решения: Phedrone

Спасибо @tym32167 за ответ. Добавил к этому коду шаффл и получил то, что хотел.

var data = new int[] { 1, 2, 3, 4 ,5};
int count = 4;
var items = Shuffle(data).Select((d, i) => data.Concat(data).Skip(i).Take(count));

Сам шаффл:

static IList<T> Shuffle<T>(IList<T> list)
{
    Random rng = new Random();
    int n = list.Count;
    while (n > 1)
    {
        n--;
        int k = rng.Next(n + 1);
        T value = list[k];
        list[k] = list[n];
        list[n] = value;
    }
    return list;
}
→ Ссылка