Небольшая переформулировка cgeers отвечает, чтобы получить нужные кортежи вместо массивов:
var combinations = from item1 in list
from item2 in list
where item1 < item2
select Tuple.Create(item1, item2);
(используйте ToList
или ToArray
, если хотите.)
В-выражение формы запроса (несколько переупорядочено):
var combinations = list.SelectMany(x => list, (x, y) => Tuple.Create(x, y))
.Where(tuple => tuple.Item1 < tuple.Item2);
Оба из них фактически будут учитывать n 2 значений вместо n 2 / 2, хотя онив итоге получу правильный ответ.Альтернативой может быть:
var combinations = list.SelectMany((x, i) => list.Skip(i + 1), (x, y) => Tuple.Create(x, y));
... но при этом используется Skip
, который может также не оптимизироваться.Честно говоря, это не имеет значения, я бы выбрал тот, который наиболее подходит для вашего использования.