如何在 Linq 中组合多个相同或不同长度的列表
本文关键字:列表 Linq 组合 | 更新日期: 2023-09-27 18:36:29
我想构建一个方法或扩展方法,该方法采用多个列表并按以下方式组合它们:
假设我有两个列表:
int[] list1 = {3, 1, 2};
int[] list2 = {5, 4 };
我希望有一个数组列表
,结果是这样的:[1,4]
[1,5]
[2,4]
[2,5]
[3,4]
[3,5]
我生成的数组列表中的列数将由数量决定的列表已传递,并且需要对两列进行排序。行数只是(列表 A
的长度)*(列表 B 的长度)*(列表 N 的长度)在此示例中为 3 * 2 = 6 行。 2 列(因为 2 个输入列表)。
使用 linq 执行此操作的优雅方式是什么?
谢谢!
尝试交叉连接
int[] list1 = {3, 1, 2};
int[] list2 = {5, 4 };
var result = (from l1 in list1
from l2 in list2
select new [] {l1, l2}).ToList()
使用 SelectMany
:
var combinations = list1.SelectMany(i1 => list2.Select(i2 => new[] { i1, i2 }));
或者如果你愿意
var combinations = list1.SelectMany(i1 => list2, (i1, i2) => new[] { i1, i2 });
如果您想按特定顺序获得结果,您可以按照OrderBy
等进行操作。
感谢@Jon为我指出正确的来源,并为他的聪明解决方案@EricLippert:
public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
IEnumerable<IEnumerable<T>> emptyProduct =
new[] { Enumerable.Empty<T>() };
return sequences.Aggregate(
emptyProduct,
(accumulator, sequence) =>
from accseq in accumulator
from item in sequence
select accseq.Concat(new[] { item }));
}
http://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/
适用于整数和字符串:
string[] list1 = {"1", "2", "3"};
string[] list2 = { "4","5" };
var lists = new List<string[]>(){list1,list2};
var result = lists.CartesianProduct();