具有n个列表的笛卡尔积

时间:2014-09-03 11:41:11

标签: c# linq permutation

我有

List<List<string>> AllSimilarWordsLists { get; set; }

我想从这些单词生成字符串,这样就不会有重复的字符串,这里重复意味着每个字符串必须包含唯一的单词

例如,如果一旦生成'你好吗'那么'你是如何'不应该在结果中考虑'。

我可以有任意数量的列表

e.g

List1   List2   List3   List4   List5
word11  word21  word21  word21  word51
word12  word22  word22  word22  word52
word13  word23  word23  word23  word53
word14  word24  word24  word24  word54
word15  word25  word25  word25  word55

这些列表将添加到AllSimilarWordsLists中。我想使用笛卡尔积生成字符串列表。找到this但是这个解决方案有固定数量的列表,任何有想法的人。

1 个答案:

答案 0 :(得分:9)

不幸的是,我不记得我找到它的地方

public static IEnumerable<IEnumerable<T>> CartesianProduct<T>
    (this IEnumerable<IEnumerable<T>> sequences)
{
    IEnumerable<IEnumerable<T>> emptyProduct =
      new[] { Enumerable.Empty<T>() };
    IEnumerable<IEnumerable<T>> result = emptyProduct;
    foreach (IEnumerable<T> sequence in sequences)
    {
        result = from accseq in result from item in sequence select accseq.Concat(new[] {item});
    }
    return result;
}