C # foreach en IEnumerable vs. List - modificación del elemento persistente solo para la matriz - ¿Por qué?

En C #, he notado que si estoy ejecutando un bucle foreach en un LINQ generadoIEnumerable<T> colección e intento modificar el contenido de cada elemento T, mis modificacionesno so persistente

Por otro lado, si aplico laToArray() oToList() método al crear mi colección, modificación de los elementos individuales en el bucle foreachso persistente

Sospecho que esto está relacionado de alguna manera con la ejecución diferida, pero exactamente cómo no es del todo obvio para mí. Realmente agradecería una explicación a esta diferencia de comportamiento.

quí hay un código de ejemplo: tengo una claseMyClass con un constructor y una propiedad implementada automáticamente:

public class MyClass
{
    public MyClass(int val) { Str = val.ToString(); }
    public string Str { get; set; }
}

En mi aplicación de ejemplo, uso LINQSelect() para crear dos colecciones deMyClass objetos basados en una colección de enteros, unoIEnumerable<MyClass>, y unoIList<MyClass> aplicando elToList() método al final.

var ints = Enumerable.Range(1, 10);
var myClassEnumerable = ints.Select(i => new MyClass(i));
var myClassArray = ints.Select(i => new MyClass(i)).ToList();

A continuación, ejecuto un bucle foreach sobre cada una de las colecciones y modifico el contenido del bucleMyClass objetos

foreach (var obj in myClassEnumerable) obj.Str = "Something";
foreach (var obj in myClassArray) obj.Str = "Something else";

Finalmente, saqué elStr miembro del primer elemento de cada colección:

Console.WriteLine(myClassEnumerable.First().Str);
Console.WriteLine(myClassArray.First().Str);

Algo intuitivamente, la salida es:

1
Something else

Respuestas a la pregunta(2)

Su respuesta a la pregunta