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

时间:2011-09-08 06:43:35

标签: 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>>

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

谢谢。

3 个答案:

答案 0 :(得分: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);
    }

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

查看以下博文:

Generating-all-permutations-of-a-sequence-in-csharp

它向您展示了如何计算C#中序列的所有可能排列,并使用测试驱动的方法来得出解决方案。