Como posso obter toda a combinação possível de um subconjunto?

Considere istoList<string>

List<string> data = new List<string>();
data.Add("Text1");
data.Add("Text2");
data.Add("Text3");
data.Add("Text4");

O problema que tive foi: como posso obter todas as combinações de um subconjunto da lista? Mais ou menos assim:

#Subset Dimension 4
Text1;Text2;Text3;Text4

#Subset Dimension 3
Text1;Text2;Text3;
Text1;Text2;Text4;
Text1;Text3;Text4;
Text2;Text3;Text4;

#Subset Dimension 2
Text1;Text2;
Text1;Text3;
Text1;Text4;
Text2;Text3;
Text2;Text4;

#Subset Dimension 1
Text1;
Text2;
Text3;
Text4;

Eu criei uma solução decente que vale a pena compartilhar aqui.

questionAnswers(4)

yourAnswerToTheQuestion