使用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 }); } }
SelectMany
从value
和index
进行投影是一种使用first
和i
进行内循环的方法。 我们需要索引,以便我们可以跳过index + 1
值,这相当于上面代码中从i + 1
开始的j
循环。
这有帮助吗? 如果没有,你能确定哪一位令人困惑吗?
编辑:Aargh - 我没有意识到你提到的另一个问题是从这个代码开始的! 我认为它仍然有用,但要给下面的段落留下一些东西......
如果您理解我的答案的替代(查询表达式)版本,那么第一个版本是类似的,只使用SelectMany
的重载,它允许您在“外部”序列中同时使用值和索引。