使用LINQ获取列表中的所有对

dil*_*ert 14 c# linq combinations tuples

如何获取列表中所有可能的项目对(顺序不相关)?

例如,如果我有

var list = { 1, 2, 3, 4 };
Run Code Online (Sandbox Code Playgroud)

我想得到这些元组:

var pairs = {
   new Tuple(1, 2), new Tuple(1, 3), new Tuple(1, 4),
   new Tuple(2, 3), new Tuple(2, 4)
   new Tuple(3, 4)
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 24

稍微重新设计cgeers的答案是为了获得你想要的元组而不是数组:

var combinations = from item1 in list
                   from item2 in list
                   where item1 < item2
                   select Tuple.Create(item1, item2);
Run Code Online (Sandbox Code Playgroud)

(使用ToList或者ToArray如果你想.)

在非查询表达式形式(稍微重新排序):

var combinations = list.SelectMany(x => list, (x, y) => Tuple.Create(x, y))
                       .Where(tuple => tuple.Item1 < tuple.Item2);
Run Code Online (Sandbox Code Playgroud)

这两个实际上都会考虑n 2个值而不是n 2/2个值,尽管它们最终会得到正确的答案.另一种选择是:

var combinations = list.SelectMany((x, i) => list.Skip(i + 1), (x, y) => Tuple.Create(x, y));
Run Code Online (Sandbox Code Playgroud)

...但是这使用Skip可能没有被优化.说实话,这可能无关紧要 - 我会选择最适合您使用的一个.