创建列表,从每个嵌套列表中获取元素

时间:2016-06-13 13:30:06

标签: c# linq set

这是以前帖子中的一个跟随问题。在澄清我之前提出的问题之后,我建议我发一个新帖子,因为问题已经发生了巨大变化,这是一个很好的建议。以下是原始问题: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的方法。挑战在于我不知道将有多少嵌套列表或每个列表中有多少项。您可以假设每个嵌套列表的长度完全相同。有任何想法吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您可以阅读Eric Lippert关于使用LINQ计算笛卡尔积的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);