【问题标题】:Select all unique combinations of a single list, with no repeats, using LINQ (Part 2)使用 LINQ 选择单个列表的所有唯一组合,不重复(第 2 部分)
【发布时间】:2011-12-20 22:43:06
【问题描述】:

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

【问题讨论】:

  • 你为什么不在那个答案下的评论中问这个?

标签: c# linq


【解决方案1】:

概念上大致相当于这个,虽然实际的执行模型当然不同(懒惰等):

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 值,这相当于上面代码中从i + 1 开始的j 循环。

这有帮助吗?如果不是,你能指出哪一点令人困惑吗?

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

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

【讨论】:

  • 所以您使用的是 SelectMany 的重载版本,msdn.microsoft.com/en-us/library/bb534732.aspx,因此 collectionSelector 创建了“内循环”,即{2, index=1} {3, index=2} 并将结果提供给 resultSelector(第二个 lambda 函数)?我了解您的其他示例,我认为我的困惑在于 lambda 函数以及第二个 lambda 函数如何构建列表。
  • @Seth:集合选择器是在此答案的代码中与 ifirst 等效的位。然后在resultSelector 中使用这些值(i 和 first)。
猜你喜欢
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多