remarks generate example c# collections c#-3.0 extension-methods

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á.