Productos cartesianos con n numero de lista.

estoy teniendo

List<List> AllSimilarWordsLists { get; set; } 

Quiero generar una cadena a partir de estas palabras de manera que ninguna cadena esté duplicada y aquí duplicado significa que todas y cada una de las cadenas debe contener palabras únicas.

por ejemplo, si una vez generado ‘Cómo estás’ entonces ‘eres cómo’ no debe considerarse en el resultado ‘.

Puedo tener cualquier numero de lista

p.ej

 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 

Estas listas se agregarán en AllSimilarWordsLists. Quiero generar lista de cuerdas usando productos cartesianos. He encontrado esto, pero esta solución es tener un número fijo de listas, Cualquiera que tenga ideas.

Desafortunadamente no recuerdo donde lo encontré

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