John Skeets回答这个问题,Select all unique combinations of a single list, with no repeats, using LINQ,效果很棒。
然而,有人可以逐个分解第一个答案的工作原理:
List<int> slotIds = new List<int> {1, 2, 3};
var query = slotIds.SelectMany((value, index) => slotIds.Skip(index + 1),
(first, second) => new { first, second });
答案 0 :(得分:6)
它在 concept 中大致相当于此,虽然实际执行模型当然不同(懒惰等):
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
个值,这相当于上面代码中从j
开始的i + 1
循环。
这有帮助吗?如果没有,你能确定哪一位令人困惑吗?
编辑:Aargh - 我没有意识到你提到的另一个问题是从这个代码开始的!我认为这仍然有用,为了给下面的段落留下一些东西......如果您理解我的答案的替代(查询表达式)版本,那么第一个版本是相似的,只使用SelectMany
的重载,它允许您在“外部”序列中同时使用值和索引