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>?
23
A
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);
Cuestiones relacionadas
- 1. IEnumerable <> to IList <>
- 2. IList <T> vs IEnumerable <T>. ¿Qué es más eficiente IList <T> o IEnumerable <T>
- 3. IList <T> no tiene "dónde"
- 4. ¿Por qué IEnumerable <T> tiene FindAll o RemoveAll métodos?
- 5. ¿Por qué IList <> tiene menos funciones que List <>?
- 6. ¿Por qué una función que toma IEnumerable <interface> no acepta IEnumerable <class>?
- 7. ¿Por qué IEnumerable <T> hereda de IEnumerable?
- 8. ¿Por qué IList <>. Reverse() no funciona como List <>(). Reversa
- 9. Por qué IEnumerable <T> se define como IEnumerable <out T>, no IEnumerable <T>
- 10. ¿Por qué no puedo incluir IEnumerable <struct> como IEnumerable <object>?
- 11. ¿Por qué el Diccionario <TKey, TValue> no tiene un IEnumerable <KeyValuePair <TKey, TValue >> ctor?
- 12. ¿Por qué IEnumerable <T> no implementa Agregar (T)?
- 13. Conversión de IEnumerable <T> a IList
- 14. IEnumerable <T> VS VS IList <T> IQueryable <T>
- 15. IList <Type> a IList <BaseType>
- 16. ¿Por qué debería devolver IList <T> sobre la lista <T>?
- 17. ¿Por qué ArrayList implementa IList, ICollection, IEnumerable?
- 18. AutoMapper: Copiar IList <> a IList <>
- 19. ¿Cuál prefiere para las interfaces: T [], IEnumerable <T>, IList <T>, u otra?
- 20. ¿Por qué TreeNodeCollection no se aplica IEnumerable <TreeNode>?
- 21. ¿Por qué la lista <T> implementa IList <T>, ICollection <T> e IEnumerable <T>?
- 22. ¿Por qué es Func <T> ambiguo con Func <IEnumerable <T>>?
- 23. Convertir de IList <T> a no genérica IList
- 24. ¿Por qué ICollection <T> implementar tanto IEnumerable <T> y IEnumerable
- 25. Diferencia entre IEnumerable e IEnumerable <T>?
- 26. ¿Por qué la implementación de 'IList <T>' requiere la definición de dos métodos 'GetEnumerator'?
- 27. ¿Por qué no Cast <double>() funciona en IEnumerable <int>?
- 28. ¿Por qué no hay Ordenar por IList <T>?!?! (editado)
- 29. Cómo convertir un IEnumerable <IEnumerable <T>> a un IEnumerable <T>
- 30. ¿Por qué (realmente lo hace?) Lista <T> implementar todas estas interfaces, no solo IList <T>?
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. –
@Sam; en efecto; pero es lo mejor que puedes hacer a través de IList; hay formas de compensar, por supuesto ... –
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