Ответ 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 };