O tipo IEnumerable<T>
não suporta essas operações. O objetivo da IEnumerable<T>
interface é permitir que um consumidor visualize o conteúdo de uma coleção. Não para modificar os valores.
Ao executar operações como .ToList (). Add (), você cria um novo List<T>
e adiciona um valor a essa lista. Não tem conexão com a lista original.
O que você pode fazer é usar o método Add extension para criar um novo IEnumerable<T>
com o valor agregado.
items = items.Add("msg2");
Mesmo nesse caso, ele não modificará o IEnumerable<T>
objeto original . Isso pode ser verificado mantendo uma referência a ele. Por exemplo
var items = new string[]{"foo"};
var temp = items;
items = items.Add("bar");
Após esse conjunto de operações, a variável temp ainda fará referência a um enumerável com um único elemento "foo" no conjunto de valores, enquanto os itens farão referência a um enumerável diferente com os valores "foo" e "bar".
EDITAR
Eu sempre esqueço que o Add não é um método de extensão típico, IEnumerable<T>
porque é um dos primeiros que eu acabo definindo. Aqui 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>
destina-se apenas à consulta de coleções. É a espinha dorsal da estrutura LINQ. É sempre uma abstração de alguma outra coleção comoCollection<T>
,List<T>
ouArray
. A interface fornece apenas umGetEnumerator
método que retorna uma instânciaIEnumerator<T>
que permite a caminhada da coleção estendida, um item de cada vez. Os métodos de extensão LINQ são limitados por essa interface.IEnumerable<T>
foi projetado para ser lido somente porque pode representar uma agregação de partes de várias coleções.