创建一个列表,从每个嵌套列表中获取一个元素
问题描述:
这是以前发布的后续问题。在澄清我先前的问题后,建议我在问题发生急剧变化时发表一个新帖子,这是一个很好的建议。这里是原来的问题:Why doesn't this LINQ Select expression work创建一个列表,从每个嵌套列表中获取一个元素
更新的问题如下。我想要的是获得每一个排列,每个新组只由列表中的一个元素组成。作为一个例子:
List<List<int>> oldList = {{1,2},{3,4}};
List<List<int>> newList = {{1,3},{1,4},{2,3},{2,4}};
我在找一些方法来将oldList转换成newList。我面临的挑战是我不知道每个列表中会有多少嵌套列表或多少个项目。你可以假设每个嵌套列表是完全相同的长度。有任何想法吗?谢谢你的帮助。
答
你可以阅读关于计算使用LINQ的笛卡尔产品的Eric Lippert的this的帖子。
这个想法是访问每个列表与当前的笛卡尔产品集制作该列表的笛卡尔积。
这是代码:
static IEnumerable<IEnumerable<T>> CartesianProduct<T>(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 }));
}
用法:
var newList = CartesianProduct(oldList);
谢谢!在编程之前我没有停下来意识到我需要笛卡儿积,我会把我的头埋在耻辱中! – michaelto20