Intenta entender el código correctamente previamente a utilizarlo a tu trabajo y si ttienes algo que aportar puedes dejarlo en la sección de comentarios.
Solución:
No puedes, porque IEnumerable
no representa necesariamente una colección a la que se pueden añadir artículos. De hecho, ¡no representa necesariamente una colección en absoluto! Por ejemplo:
IEnumerable ReadLines()
string s;
do
s = Console.ReadLine();
yield return s;
while (!string.IsNullOrEmpty(s));
IEnumerable lines = ReadLines();
lines.Add("foo") // so what is this supposed to do??
Sin embargo, lo que puede hacer es crear un nuevoIEnumerable
objeto (de tipo no especificado), que, cuando se enumera, proporcionará todos los elementos del anterior, además de algunos propios. Tu usas Enumerable.Concat
para eso:
items = items.Concat(new[] "foo" );
Este no cambiará el array objeto (de todos modos, no puede insertar elementos en matrices). Pero creará un nuevo objeto que enumerará todos los elementos en el array, y luego “Foo”. Además, ese nuevo objeto hacer un seguimiento de los cambios en el array (es decir, siempre que lo enumere, verá los valores actuales de los elementos).
El tipo IEnumerable
no admite este tipo de operaciones. El propósito de IEnumerable
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
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 una nueva IEnumerable
con el valor agregado.
items = items.Add("msg2");
Incluso en este caso no modificará el original. IEnumerable
objeto. 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 valores “foo” y “bar”.
EDITAR
Constantemente olvido que Add no es un método de extensión típico en IEnumerable
porque es una de las primeras que termino definiendo. Aquí está
public static IEnumerable Add(this IEnumerable e, T value)
foreach ( var cur in e)
yield return cur;
yield return value;
¿Has considerado usar ICollection
o IList
interfaces en cambio, existen por la misma razón que desea tener un Add
método en un IEnumerable
.
IEnumerable
se usa para ‘marcar’ un tipo como … bueno, enumerable o simplemente una secuencia de elementos sin necesariamente garantizar si el objeto subyacente real admite la adición/eliminación de elementos. Recuerde también que estas interfaces implementan IEnumerable
para que obtenga todos los métodos de extensión que obtiene con IEnumerable
así como.