¿Cómo puedo obtener todas las combinaciones posibles de un subconjunto?

Considera estoList<string>

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

El problema que tuve fue: ¿cómo puedo obtener cada combinación de un subconjunto de la lista? Algo así:

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

Se me ocurrió una solución decente que vale la pena compartir aquí.

Respuestas a la pregunta(4)

Su respuesta a la pregunta