是curiouis并环顾四周寻找LINQ排列解决方案并在此处找到了一个:
What is the best way to find all combinations of items in an array?
以下是相关代码:
static IEnumerable<IEnumerable<T>> GetPermutations<T>(IEnumerable<T> list, int length)
{
if (length == 1) return list.Select(t => new T[] { t });
return GetPermutations(list, length - 1)
.SelectMany(t => list.Where(o => !t.Contains(o)),
(t1, t2) => t1.Concat(new T[] { t2 }));
}
我在很大程度上理解了解决方案,但我不确定SelectMany中t1
和t2
引用了什么。我知道t1
是一个可枚举的t2
是T.任何解释都会很棒,谢谢!
编辑*
哎呀,我看错了SelectMany文档。正确的一个签名是https://msdn.microsoft.com/en-us/library/bb534631(v=vs.110).aspx。
答案 0 :(得分:1)
第二个lambda是resultSelector
,允许修改所选集合(t2
),具体取决于拥有集合的实例(t1
)。
在您的具体示例中,t1
是list
的排列,t2
是list
中不属于t1
的所有元素的元素
因此(t1, t2) => t1.Concat(new T[] { t2 })
用于从给定的排列t1
和到目前为止list
中未使用的元素产生下一代“排列”。
让list
为{ 1, 2, 3, 4 }
,让t1
为{ 1, 2 }
。
然后collectionSelector
将选择list
内不是t1
内的所有元素,即{ 3, 4 }
,而resultSelector
会将每个元素追加到t1
{1}}一次。
因此产生排列{ 1, 2, 3 }
和{ 1, 2, 4 }
。