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 });
}
}
}