约翰·斯基茨回答了这个问题,使用 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(使用前将#替换为@)