Jak mogę uzyskać wszystkie możliwe kombinacje podzbioru?

Rozważ toList<string>

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

Miałem problem: jak mogę uzyskać każdą kombinację podzbioru listy? Tak to wygląda:

#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;

Wymyśliłem przyzwoite rozwiązanie, które warto podzielić się tutaj.

questionAnswers(4)

yourAnswerToTheQuestion