c# - generate - AddRange a una colección
params comments c# (6)
Desde .NET4.5
si desea un trazador de líneas, puede utilizar System.Collections.Generic
ForEach.
source.ForEach(o => destination.Add(o));
o incluso más corto como
source.ForEach(destination.Add);
En cuanto a rendimiento, es lo mismo que para cada ciclo (azúcar sintáctico).
Tampoco intentes asignarlo como
var x = source.ForEach(destination.Add)
porque ForEach
es nulo.
Un compañero de trabajo me preguntó hoy cómo agregar un rango a una colección. Él tiene una clase que hereda de Collection<T>
. Hay una propiedad de solo obtener de ese tipo que ya contiene algunos elementos. Él quiere agregar los artículos en otra colección a la colección de propiedades. ¿Cómo puede hacerlo en una forma amigable para C # 3? (Tenga en cuenta la restricción sobre la propiedad get-only, que impide soluciones como hacer Union y reasignar).
Claro, un foreach con propiedad. Agregar funcionará Pero un AddRange de tipo List<T>
sería mucho más elegante.
Es bastante fácil escribir un método de extensión:
public static class CollectionHelpers
{
public static void AddRange<T>(this ICollection<T> destination,
IEnumerable<T> source)
{
foreach (T item in source)
{
destination.Add(item);
}
}
}
Pero tengo la sensación de que estoy reinventando la rueda. No encontré nada similar en System.Linq
o morelinq .
Mal diseño? ¿Solo llamar Agregar? ¿Perdiendo lo obvio?
Las clases de Biblioteca de colecciones genéricas de C5 admiten el método AddRange
. C5 tiene una interfaz mucho más robusta que realmente expone todas las características de sus implementaciones subyacentes y es compatible con la ICollection
con las interfaces System.Collections.Generic
ICollection
e IList
, lo que significa que las colecciones de C5
pueden sustituirse fácilmente como la implementación subyacente.
No, esto parece perfectamente razonable. Hay una List<T>.
AddRange() método AddRange() básicamente hace esto, pero requiere que su colección sea una List<T>
concreta List<T>
.
Pruebe a enviar contenido a la Lista en el método de extensión antes de ejecutar el ciclo. De esta forma, puede aprovechar el rendimiento de List.AddRange.
public static void AddRange<T>(this ICollection<T> destination,
IEnumerable<T> source)
{
List<T> list = destination as List<T>;
if (list != null)
{
list.AddRange(source);
}
else
{
foreach (T item in source)
{
destination.Add(item);
}
}
}
Puede agregar su rango IEnumerable a una lista y luego configurar ICollection = en la lista.
IEnumerable<T> source;
List<item> list = new List<item>();
list.AddRange(source);
ICollection<item> destination = list;
Recuerde que cada Add
verificará la capacidad de la colección y la cambiará de tamaño cada vez que sea necesario (más lento). Con AddRange
, la colección se establecerá la capacidad y luego se agregarán los elementos (más rápido). Este método de extensión será extremadamente lento, pero funcionará.