Есть также операторы, которые я внес в проект MoreLinq в Google Code в ветви EvenMoreLinq
. Если вам просто интересно узнать, как реализован алгоритм, выздесь можно увидеть код для Permutations<T>()
.
Они разработаны так, чтобы хорошо сочетаться с LINQ и использовать как отложенную, так и потоковую оценку.Перестановки интересны, поскольку генерация всех перестановок - это операция N!
, которая становится очень большой даже при небольших значениях N
.В зависимости от того, как вы генерируете перестановки, вы можете (или не можете) фактически перечислять их все.
Вы также найдете алгоритмы для других комбинаторных операций ( Подмножества , PermutedSubsets , Декартовы произведения , Случайные подмножества , Срезы , Разделы и т. Д.) В той же кодовой базе.
Вот как вы можете использовать расширения MoreLinq для перестановки последовательности.Так, например, вы можете переставить строку (которая рассматривается как последовательность char
с) следующим образом:
using MoreLinq;
string input = "cat";
var permutations = input.Permutations();
foreach( var permutation in permutations )
{
// 'permutation' is a char[] here, so convert back to a string
Console.WriteLine( new string(permutation) );
}