从Enumerable <int>生成所有可能的序列

Tor*_*mod 1 c# linq algorithm c#-4.0

鉴于清单{1,2,3,4,5}

我想在C#中生成这些数字的所有可能序列.

1,2,3,4,5 1,2,3,5,4等

如果它是懒惰评估会很好,但它不是必需的.

应该回来

IEnumerable<IEnumerable<int>>
Run Code Online (Sandbox Code Playgroud)

我的目的是将它包装成一个自定义LINQ运算符("permutate"或其他东西).但任何好的算法都将是一个良好的开端.

谢谢.

Car*_*ten 5

尝试这样的事情:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

当然你可以在那里更改List-implementation但是internaly我会坚持一些集合,因为remove更容易处理(.有可能但不具有可读性或高性能)