使用 LINQ 选择单个列表的所有唯一组合,不重复

Posted

技术标签:

【中文标题】使用 LINQ 选择单个列表的所有唯一组合,不重复【英文标题】:Select all unique combinations of a single list, with no repeats, using LINQ 【发布时间】:2011-03-29 15:25:06 【问题描述】:

我有一个数字列表,我需要使用 LINQ 查询创建列表中数字的每个可能的唯一组合,不重复。因此,例如,如果我有 1, 2, 3 ,则组合将是 1-21-32-3

我目前使用两个for 循环,如下所示:

for (int i = 0; i < slotIds.Count; i++)

    for (int j = i + 1; j < slotIds.Count; j++)
    
        ExpressionInfo info1 = _expressions[i];
        ExpressionInfo info2 = _expressions[j];

        // etc...
    

是否可以将这两个for 循环转换为 LINQ?

谢谢。

【问题讨论】:

组合总是有序的,对吧? 【参考方案1】:

当然 - 您可以通过对 SelectMany 的一次调用和对 Skip 的嵌入式调用来完成:

var query = slotIds.SelectMany((value, index) => slotIds.Skip(index + 1),
                               (first, second) => new  first, second );

这是一个替代选项,它不使用相当这样深奥的SelectMany重载:

var query = from pair in slotIds.Select((value, index) => new  value, index )
            from second in slotIds.Skip(pair.index + 1)
            select new  first = pair.value, second ;

它们的作用基本相同,只是方式略有不同。

这是另一个更接近您的原始选项的选项:

var query = from index in Enumerable.Range(0, slotIds.Count)
            let first = slotIds[index] // Or use ElementAt
            from second in slotIds.Skip(index + 1)
            select new  first, second ;

【讨论】:

关于深奥的第一个解决方案的讨论请参见:***.com/questions/7991486/… @David:我不相信 .NET 中的任何集合在多次迭代且之间没有变化时以不同的顺序返回元素。我们不在乎顺序是什么,只要它是一致的。 Dangit,那么我们在某个地方遇到了最奇怪的错误,谢谢,我将删除我的 2 个 cmets:p @David:如果你能重现它,请务必创建一个新问题并用链接 ping 这个问题 :)

以上是关于使用 LINQ 选择单个列表的所有唯一组合,不重复的主要内容,如果未能解决你的问题,请参考以下文章

选择具有唯一 linq 查询的所有相关实体 [重复]

如何使用 linq 将列表中的列表转换为单个列表 [重复]

如何从列表中创建唯一的非重复对组合

从python列表中获取元素的唯一组合[重复]

如何返回所有具有 N 总和的唯一数字组合 [重复]

如何使用Javascript从特定的单个数组中查找所有不重复的组合