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;
}