Recorriendo una lista de acciones

No puedo entender cómo recorrer unAction lista. Cuando lo intento, termino con los valores iguales a la iteración anterior.

Aquí está el código (ejemplo simplificado):

string[] strings = { "abc", "def", "ghi" };

var actions = new List<Action>();
foreach (string str in strings)
    actions.Add(new Action(() => { Trace.WriteLine(str); }));

foreach (var action in actions)
    action();

Salida

ghi
ghi
ghi

Por qué siempre está seleccionando el elemento final enstrings cuando realiza la acción?
¿Y cómo puedo lograr el resultado deseado que sería:

abc
def
ghi

Respuestas a la pregunta(6)

Su respuesta a la pregunta