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

Select all unique combinations of a single list, with no repeats, using LINQ

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

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

1
2
3
4
5
6
7
8
9
10
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?

谢谢。


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

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

这里有一个备选方案,它不使用如此深奥的SelectMany过载:

1
2
3
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 };

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

这是另一个更接近你原来的选择:

1
2
3
4
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 };