SelectMany中的第二个lambda

时间:2016-08-30 15:36:11

标签: c# linq lambda

是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中t1t2引用了什么。我知道t1是一个可枚举的t2是T.任何解释都会很棒,谢谢!

编辑*

哎呀,我看错了SelectMany文档。正确的一个签名是https://msdn.microsoft.com/en-us/library/bb534631(v=vs.110).aspx

1 个答案:

答案 0 :(得分:1)

第二个lambda是resultSelector,允许修改所选集合(t2),具体取决于拥有集合的实例(t1)。

在您的具体示例中,t1list的排列,t2list中不属于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 }