read - set ienumerable c#
¿Debo devolver un IEnumerable o IList? (7)
Deseo devolver una lista ordenada de artículos de un método. ¿Debería mi tipo de devolución ser IEnumerable o IList?
Depende de lo que quieras hacer con el resultado. Si necesita obtener el recuento de elementos u obtener acceso aleatorio a elementos individuales, vaya con un IList.
Si las personas que llaman solo quieren repetir los elementos, entonces ve a IEnumerable, pero debes documentar si el valor devuelto se evaluará de forma diferida o no , muchas instancias de IEnumerable actualmente representan consultas que se ejecutarán cuando se enumere la colección. Para estar seguro, si lo que estás devolviendo no se evaluará a pedido, iría con IList.
En general, es mejor devolver IEnumerable<T>
, siempre que tenga todo lo que necesita la persona que llama.
IEnumerable<T>
es foreachable, que es todo lo que se necesita para muchos consumidores. También es de solo lectura, lo que a menudo es algo bueno: significa que a veces puede optimizar devolviendo su colección de respaldo real, sin preocuparse demasiado por alguien que lo modifique sin decírselo.
Sin embargo, si el consumidor necesita métodos que no están en IEnumerable<T>
, entonces IList<T>
podría tener más sentido. Por ejemplo, la persona que llama puede llamar a Contains
, que no está en IEnumerable<T>
. O la persona que llama puede querer indexar en la lista, en lugar de repetirla de principio a fin.
Pero también puede hacer Contiene e indexar en IEnumerable<T>
, a través de los métodos de extensión Contains y ElementAt LINQ. Entonces, hay una cuestión de grado aquí. Si la persona que llama solo necesita hacer una pregunta que no está disponible en IEnumerable<T>
, como "está esta vacía", entonces devuelva un IEnumerable<T>
y use el método de extensión Any . Pero si la persona que llama usa IList<T>
operaciones extensamente, devuelva IList<T>
.
Es fácil, si la persona que llama solo debe usarlo Readonly, use IEnumerable. ya que esto también es compatible con la covarianza (el resultado se puede convertir a un tipo base)
Hay una jerarquía aquí:
interface IList<T> : ICollection<T> { }
interface ICollection<T> : IEnumerable<T> { }
Desea apuntar al menor acoplamiento posible, entonces devuelva un IEnumerable<T>
si eso es suficiente. Probablemente lo sea
Devuelva un IList<T>
si la situación requiere que la persona que llama obtenga una Lista que pueda usar para Agregar / Insertar / Eliminar. Pero incluso así podría ser mejor si el llamador creara su propia lista de la colección IEnumerable.
IEnumerable es menos específico que un IList, es decir, IList tiene funciones que IEnumerable no tiene.
Compare los dos para ver si uno tiene las funciones que necesita y el otro no.
Si quieres devolver una lista ordenada, tal vez deberías devolver una SortedList.
http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx
Puedes asociar una orden con los objetos.
Un IList tiene los métodos para cambiar los elementos (como Agregar), quizás desee seleccionar entre ICollection e IEnumerable.
ICollection extiende IEnumerable y tiene la propiedad Count disponible que puede ser útil.