El tipo IEnumerable<T>
no admite tales operaciones. El propósito de la IEnumerable<T>
interfaz es permitir que un consumidor vea el contenido de una colección. No modificar los valores.
Cuando realiza operaciones como .ToList (). Add (), está creando una nueva List<T>
y agregando un valor a esa lista. No tiene conexión con la lista original.
Lo que puede hacer es usar el método Agregar extensión para crear uno nuevo IEnumerable<T>
con el valor agregado.
items = items.Add("msg2");
Incluso en este caso no modificará el IEnumerable<T>
objeto original . Esto se puede verificar manteniendo una referencia a él. Por ejemplo
var items = new string[]{"foo"};
var temp = items;
items = items.Add("bar");
Después de este conjunto de operaciones, la variable temp solo hará referencia a un enumerable con un solo elemento "foo" en el conjunto de valores, mientras que los elementos harán referencia a un enumerable diferente con los valores "foo" y "bar".
EDITAR
Continuamente olvido que Agregar no es un método de extensión típico IEnumerable<T>
porque es uno de los primeros que termino definiendo. Aquí está
public static IEnumerable<T> Add<T>(this IEnumerable<T> e, T value) {
foreach ( var cur in e) {
yield return cur;
}
yield return value;
}
IEnumerable<T>
está destinado solo a consultar colecciones. Es la columna vertebral del marco LINQ. Siempre es una abstracción de alguna otra colección comoCollection<T>
,List<T>
oArray
. La interfaz solo proporciona unGetEnumerator
método que devuelve una instancia deIEnumerator<T>
que permite recorrer la colección extendida un elemento a la vez. Los métodos de extensión LINQ están limitados por esta interfaz.IEnumerable<T>
está diseñado para ser leído solo porque puede representar una agregación de partes de múltiples colecciones.