Генерация всех возможных последовательностей из Enumerable <int> - PullRequest
1 голос
/ 08 сентября 2011

заданный список {1,2,3,4,5}

Я хочу сгенерировать все возможные последовательности этих чисел в C #.

1,2,3,4,5 1,2,3,5,4 и т.д.

Было бы хорошо, если бы его лениво оценивали, но это не обязательно.

Должен вернуться

IEnumerable<IEnumerable<int>>

Мое намерение состоит в том, чтобы обернуть это в пользовательский оператор LINQ («permutate» или что-то в этом роде). Но любой хороший алгоритм будет хорошим началом.

Спасибо.

Ответы [ 3 ]

5 голосов
/ 08 сентября 2011

попробуйте что-то вроде этого:

    public static IEnumerable<List<T>> GetPermutations<T>(IEnumerable<T> items)
    {
        if (!items.Any()) 
            yield return new List<T>();
        foreach (var i in items)
        {
            var copy = new List<T>(items);
            copy.Remove(i);
            foreach(var rest in GetPermutations(copy))
            {
                rest.Insert(0, i);
                yield return rest;
            }
        }
    }

    public static IEnumerable<IEnumerable<T>>  GetEnumPermutations<T>(IEnumerable<T> items )
    {
        return GetPermutations(items);
    }

конечно, вы можете изменить реализацию List там, но внутренне я бы придерживался некоторой коллекции, потому что удаление легче обрабатывать (. Где это возможно, но не так читаемо или производительно)

0 голосов
/ 08 сентября 2011

Взгляните на следующее сообщение в блоге:

Генерация всех перестановок последовательности в цепочке

Он показывает, как рассчитать все возможные перестановки последовательности в C #, и использует подход, основанный на тестировании, чтобы прийти к решению.

0 голосов
/ 08 сентября 2011
    List<int> li = new List<int> { 1, 2, 3, 4, 5 };
    var ff = from a in li
             join b in li on 1 equals 1
             join c in li on 1 equals 1
             join d in li on 1 equals 1
             join e in li on 1 equals 1
             where 
             a != b && b != c && c != d && d != e &&
             a != c && b != d && c != e &&
             a != d && b != e && 
             a != e 
             select new { a, b, c, d, e };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...