read lista convertir c# ienumerable add

lista - read ienumerable c#



Código para agregar a IEnumerable (7)

Tengo un enumerador como este

IEnumerable<System.Windows.Documents.FixedPage> page;

¿Cómo puedo agregar una página (por ejemplo: D: / newfile.txt)? He intentado Add , Concat , Concat , etc. Pero nada funcionó para mí.


No puede agregar elementos a IEnumerable<T> , ya que no admite operaciones de adición. IEnumerable<T> utilizar una implementación de ICollection<T> o convertir IEnumerable<T> a ICollection<T> si es posible.

IEnumerable<System.Windows.Documents.FixedPage> page; .... ICollection<System.Windows.Documents.FixedPage> pageCollection = (ICollection<System.Windows.Documents.FixedPage>) page

Si el reparto es imposible, use por ejemplo

ICollection<System.Windows.Documents.FixedPage> pageCollection = new List<System.Windows.Documents.FixedPage>(page);

Puedes hacerlo así:

ICollection<System.Windows.Documents.FixedPage> pageCollection = (page as ICollection<System.Windows.Documents.FixedPage>) ?? new List<System.Windows.Documents.FixedPage>(page);

Este último casi te garantiza que tienes una colección que es modificable. Sin embargo, cuando se usa cast, es posible obtener con éxito la colección, pero todas las operaciones de modificación arrojan NotSupportedException Esto es así para las colecciones de sólo lectura. En tales casos, el enfoque con el constructor es la única opción.

La ICollection<T> implementa IEnumerable<T> , por lo que puede usar pageCollection dondequiera que esté usando la page actualmente.


Si tiene una idea de cuál es el tipo original de IEnumerable, puede modificarlo ...

List<string> stringList = new List<string>(); stringList.Add("One"); stringList.Add("Two"); IEnumerable<string> stringEnumerable = stringList.AsEnumerable(); List<string> stringList2 = stringEnumerable as List<string>; if (stringList2 != null) stringList2.Add("Three"); foreach (var s in stringList) Console.WriteLine(s);

Esto produce:

One Two Three

Cambia la instrucción foreach para iterar sobre stringList2 , o stringEnumerable , obtendrás lo mismo.

La reflexión puede ser útil para determinar el tipo real de IEnumerable.

Sin embargo, es probable que esta no sea una buena práctica ... Lo que sea que te haya dado el IEnumerable probablemente no espera que la colección se modifique de esa manera.


Tratar

IEnumerable<System.Windows.Documents.FixedPage> page = new List<System.Windows.Documents.FixedPage>(your items list here)

o

IList<System.Windows.Documents.FixedPage> page = new List<System.Windows.Documents.FixedPage>(1); page.Add(your item Here);


IEnumerable<T> es una interfaz de solo lectura. En su lugar, debe utilizar un IList<T> , que proporciona métodos para agregar y eliminar elementos.


IEnumerable<T> no contiene una forma de modificar la colección.

Deberá implementar ICollection<T> o IList<T> ya que éstas contienen funciones Agregar y Eliminar.


IEnumerable es inmutable. No puede agregar elementos, no puede eliminar elementos.
Las clases de System.Collections.Generic devuelven esta interfaz para que pueda iterar sobre los elementos contenidos en la colección.

Desde MSDN

Exposes the enumerator, which supports a simple iteration over a collection of a specified type.

Vea here para referencia de MSDN.


Sí, es posible

Es posible concatenar secuencias (IEnumerables) juntas y asignar el resultado concatenado a una nueva secuencia. (No puede cambiar la secuencia original).

El Enumerable.Concat() incorporado solo concatenará otra secuencia; sin embargo, es fácil escribir un método de extensión que le permita concatenar un escalar a una secuencia.

El siguiente código demuestra:

using System; using System.Collections.Generic; using System.Linq; namespace Demo { public class Program { [STAThread] private static void Main() { var stringList = new List<string> {"One", "Two", "Three"}; IEnumerable<string> originalSequence = stringList; var newSequence = originalSequence.Concat("Four"); foreach (var text in newSequence) { Console.WriteLine(text); // Prints "One" "Two" "Three" "Four". } } } public static class EnumerableExt { /// <summary>Concatenates a scalar to a sequence.</summary> /// <typeparam name="T">The type of elements in the sequence.</typeparam> /// <param name="sequence">a sequence.</param> /// <param name="item">The scalar item to concatenate to the sequence.</param> /// <returns>A sequence which has the specified item appended to it.</returns> /// <remarks> /// The standard .Net IEnumerable extensions includes a Concat() operator which concatenates a sequence to another sequence. /// However, it does not allow you to concat a scalar to a sequence. This operator provides that ability. /// </remarks> public static IEnumerable<T> Concat<T>(this IEnumerable<T> sequence, T item) { return sequence.Concat(new[] { item }); } } }