【发布时间】:2013-10-22 15:33:46
【问题描述】:
我想构建一个方法或扩展方法接受多个列表并按以下方式组合它们:
假设我有两个列表:
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 做这件事的优雅方式是什么?
谢谢!
【问题讨论】:
-
你有没有试过先用普通循环和自然算法来解决这个问题?对于如此复杂的问题,我永远不会使用
LINQ。即使LINQ可以为您做到这一点,它也会比普通循环效率更低,hard-to-understand更多。 不应不惜一切代价使用LINQ。 -
我同意 LINQ 有时可能更难理解且效率更低,但我想了解更多有关它的信息。我想过用普通循环解决这个问题,但对 LINQ 方式很好奇。我的应用程序不会处理大量列表,所以我认为性能应该不是问题。
-
@KingKing:这是一个用 LINQ 解决的完全合理的问题,而且一点也不复杂。二元笛卡尔积实际上是基础 LINQ 序列运算
SelectMany。所有 LINQ 运算符都可以由SelectMany构建;它是序列单子的绑定操作。 n 元笛卡尔积当然要复杂一些。 -
@EricLippert 谢谢,也许你对
LINQ太熟悉了,对我来说,有时我仍然觉得用传统循环(和单独的方法)想出解决方案比使用LINQ更容易,但是我仍然尽可能部分地使用LINQ(不是one-line LINQ)。 -
@EricLippert 如果您像您一样发布我的回答,我将很乐意接受您的回答。当功劳归于你时,我不想接受我自己的答案。谢谢!