c# - item - ¿Cuál es la mejor manera de agregar un elemento a un<Enumerable<T>?
read ienumerable c# (5)
Dado que IEnumerable
es de solo lectura, debe convertir a la lista.
var new_one = arr.ToList().Add("JKL");
O puede obtener un método de extensión como;
public static IEnumerable<T> Append<T>(this IEnumerable<T> source, params T[] item)
{
return source.Concat(item);
}
Así es como agregaría un elemento a un objeto IEnumerable:
//Some IEnumerable<T> object
IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" };
//Add one item
arr = arr.Concat(new string[] { "JKL" });
Esto es incómodo. No veo un método llamado algo como ConcatSingle()
sin embargo.
¿Hay una forma más limpia de agregar un solo elemento a un objeto IEnumerable?
Escribe un método de extensión ConcatSingle
:)
public static IEnumerable<T> ConcatSingle<T>(this IEnumerable<T> source, T item)
{
return source.Concat(new [] { item } );
}
Pero necesitas ser más cuidadoso con tu terminología.
No puede agregar un elemento a un IEnumerable<T>
. Concat
crea una nueva instancia.
Ejemplo:
var items = Enumerable.Range<int>(1, 10)
Console.WriteLine(items.Count()); // 10
var original= items;
items = items.ConcatSingle(11);
Console.WriteLine(original.Count()); // 10
Console.WriteLine(items.Count()); // 11
Como puede ver, la enumeración original, que guardamos en el original
, no cambió.
Estás asignando una matriz a un IEnumerable. ¿Por qué no usa el tipo Array en lugar de IEnumerable?
De lo contrario, puede utilizar IList (o Lista) si desea cambiar la colección.
Utilizo IEnumerable solo para los parámetros de métodos cuando necesito leer e IList (o Lista) cuando necesito cambiar los elementos en él.
No, eso es tan conciso como el que obtendrás utilizando las características integradas de lenguaje / marco.
Siempre puedes crear un método de extensión si prefieres:
arr = arr.Append("JKL");
// or
arr = arr.Append("123", "456");
// or
arr = arr.Append("MNO", "PQR", "STU", "VWY", "etc", "...");
// ...
public static class EnumerableExtensions
{
public static IEnumerable<T> Append<T>(
this IEnumerable<T> source, params T[] tail)
{
return source.Concat(tail);
}
}
IEnumerable
es una colección inmutable , lo que significa que no puede agregar o eliminar elementos. En su lugar, debe crear una nueva colección para esto, simplemente para convertir a la lista para agregar:
var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added