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

时间:2011-11-03 07:31:21

标签: c# linq

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 });

1 个答案:

答案 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 });
    }
}

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

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

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

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