鉴于列表{1,2,3,4,5}
我想在C#中生成这些数字的所有可能序列。
1,2,3,4,5 1,2,3,5,4 等
如果它是懒惰评估会很好,但它不是必需的。
应该返回
IEnumerable<IEnumerable<int>>
我的目的是将它包装成一个自定义LINQ运算符(“permutate”或其他东西)。但任何好的算法都将是一个良好的开端。
谢谢。
答案 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#中序列的所有可能排列,并使用测试驱动的方法来得出解决方案。