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

2024-05-19

约翰·斯基茨回答了这个问题,使用 LINQ 选择单个列表的所有唯一组合,不重复 https://stackoverflow.com/questions/3479980/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 });

它大致相当于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 });
    }
}

The SelectMany进行投影value and index是一种同时使用两者的方法first and i制作一个内循环。我们需要索引以便我们可以跳过index + 1值,这相当于j循环开始于i + 1在上面的代码中。

这有帮助吗?如果没有,您能指出哪一点令人困惑吗?

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐