Выберите все уникальные комбинации одного списка без повторов, используя LINQ

У меня есть список чисел, и мне нужно создать каждую возможную уникальную комбинацию чисел в списке без повторений, используя запрос LINQ. Так, например, если у меня есть { 1, 2, 3 }, комбинации будут 1-2, 1-3 и 2-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 };