使用LINQ选择单个列表的所有唯一组合,没有重复(第2部分)

John Skeets回答了这个问题, 选择单个列表的所有唯一组合,没有重复,使用LINQ ,工作得非常好。

但是,有人可以逐个分解第一个答案如何工作的内部工作方式:

List slotIds = new List {1, 2, 3}; var query = slotIds.SelectMany((value, index) => slotIds.Skip(index + 1), (first, second) => new { first, second }); 

虽然实际执行模型当然不同(懒惰等),但它在概念上大致相当于此:

 for (int i = 0; i < slotIds.Count; i++) { int first = slotIds[i]; for (int j = i + 1; j < slotIds.Count; j++) { int second = slotIds[j]; results.Add(new { first, second }); } } 

SelectManyvalueindex进行投影是一种使用firsti进行内循环的方法。 我们需要索引,以便我们可以跳过index + 1值,这相当于上面代码中从i + 1开始的j循环。

这有帮助吗? 如果没有,你能确定哪一位令人困惑吗?

编辑:Aargh - 我没有意识到你提到的另一个问题是从这个代码开始的! 我认为它仍然有用,但要给下面的段落留下一些东西......

如果您理解我的答案的替代(查询表达式)版本,那么第一个版本是类似的,只使用SelectMany的重载,它允许您在“外部”序列中同时使用值和索引。