2009-07-12 19 views
23

Estoy en una situación en la que solo deseo agregar valores en una matriz de cadenas (escriba String []) a un objeto con IList <String>. Una búsqueda rápida en MSDN reveló que IList < El método Insert de T > solo tiene una versión que toma un índice y un objeto T, y no tiene una versión que toma IEnumerable <T> en lugar de T. ¿Esto significa que Tengo que escribir un bucle sobre una lista de entrada para poner valores en la lista de destinos? Si ese es el caso, parece un diseño de API muy limitante y poco amistoso para mí. Tal vez, me estoy perdiendo algo. ¿Qué hacen los expertos en C# en este caso?¿Por qué IList <T> no tiene Insertar métodos que toman IEnumerable <T>?

Respuesta

38

Debido a que una interfaz es generalmente la menos funcionalidad necesaria para que sea utilizable, para reducir la carga de los implementadores. Con C# 3.0 puede agregar esto como método de extensión:

public static void AddRange<T>(this IList<T> list, IEnumerable<T> items) { 
    if(list == null) throw new ArgumentNullException("list"); 
    if(items == null) throw new ArgumentNullException("items"); 
    foreach(T item in items) list.Add(item); 
} 

et voila; IList<T> ahora tiene AddRange:

IList<string> list = ... 
string[] arr = {"abc","def","ghi","jkl","mno"}; 
list.AddRange(arr); 
+7

se puede hacer eso, pero su tiene sus riesgos, cuando se llama AddRange, se puede esperar que el objeto subyacente de tener una cierta comprensión de que esté operando en un rango. En un escenario de enlace de datos, esto puede terminar activando miles de eventos en un escenario donde un evento hubiera sido suficiente. –

+0

@Sam; en efecto; pero es lo mejor que puedes hacer a través de IList ; hay formas de compensar, por supuesto ... –

+1

Gracias por la respuesta Marc. Todavía siento que la interfaz debe diseñarse de manera que la usabilidad tenga más peso que la facilidad de implementación, considerando que agregar una lista a otra lista es una operación tan común. De todos modos, el método de extensión funciona muy bien en este caso, por lo que podría no ser nada para preocuparse .. – Kei

Cuestiones relacionadas