2011-04-03 14 views
7

Lo siento por una pregunta tan vaga, pero he estado buscando la mejor parte de un día, he leído artículo tras artículo (y muchas preguntas aquí) pero no puedo encontrar una respuesta fácil de entender.¿Cuál es la diferencia entre el IEnumerable no genérico y el IEnumerable genérico <T>?

I (creo que) saben lo que es para IEnumerable, pero simplemente no puede entender lo que significa cuando se define con un argumento de tipo genérico, por ejemplo:

IEnumerable<int> test = method(); 

Esto sólo me está volviendo ¡enojado! ¿Por favor sácame de la miseria y explica lo que significa?

Respuesta

13

Un IEnumerable es básicamente una colección de objetos. Tiene el método GetEnumerator() que le permite iterar a través de todos los objetos en el enumerable.

Un IEnumerable<int> es básicamente una colección de números enteros. Tiene el método GetEnumerator() que le permite iterar a través de todos los enteros en el enumerable.

IEnumerable<int> test = method(); significa que method() está obteniendo una colección si son enteros de algún lado. Podría ser una Lista, una matriz u otro tipo de datos, pero definitivamente es un grupo de ellos y todos son enteros, y usted tiene la capacidad de iterar a través de ellos.

Este puesto puede ser útil también: What's the difference between IEnumerable and Array, IList and List?

+0

Ok, creo que ahora entiendo, no me di cuenta de que podría ser una colección y simplemente no entendí cómo funcionó. ¿Hay algún buen recurso que pueda mostrar que muestre los beneficios/dificultades al comparar IEnumerable/list/arrays ya que realmente quiero aprender más? +1 (¡cuando puedo!) – idiot

+0

Las listas y las matrices implementan 'IEnumerable'. Todas las colecciones genéricas en 'System.Collections.Generic' implementan' IEnumerable '. Puede que le interese esta publicación: http://stackoverflow.com/questions/764748/whats-the-difference-between-ienumerable-and-array-ilist-and-list – smartcaveman

+0

Gracias ... y marcando como respuesta ... También querrás editar/poner ese enlace en tu respuesta principal, porque eso realmente me ha hecho entender completamente ahora. – idiot

2

Pienso en IEnumerable<int> de la misma forma en que pensaría en un List<int>, supongo que es un poco más natural. Con la advertencia de que un IEnumerable<int> no hace tanto como un List<int>, y que en esencia es sólo una cosa de enteros que se pueden enumerar

+2

Realmente no me gusta esta analogía. Una lista supone que todos los elementos están en un solo lugar. Donde como un 'IEnumerable' solo dice que puede obtener todos los elementos en alguna secuencia. Es como la diferencia entre una guía telefónica e Internet. Puedo obtener todos los números para fontaneros en Chicago desde cualquier lugar, pero en la guía telefónica, ya están en una lista, mientras que en un 'IEnumerable' o en Internet, pueden ser lo que sea, solo necesito saber cómo encuéntrelos - aunque no los rechacé, solo creo que su respuesta podría usar un poco más de claridad. – smartcaveman

+0

user689466 está buscando una manera de entender IEnumerable. Claramente hay diferencias, es solo un punto de partida con un concepto fácilmente comprensible y una vez que piensa que puede pasar a comprender las sutilezas entre los dos – kenwarner

0

La palabra que está buscando es "genéricos", y el ejemplo que das es que IEnumerable se usa como genérico para artículos de tipo int. Lo que eso significa es que la colección IEnumerable que está utilizando está fuertemente tipada para contener solo objetos int en comparación con cualquier otro tipo.

Google "C# generics IEnumerable" y encontrarás toda la información que quieras sobre esto.

0

IEnumerable significa que se puede usar en un bucle foreach.

test se puede utilizar en forma de

foreach(int item : test) 
{ 
    console.writeline(item); 
} 
2

Un IEnumerable tiene un método GetEnumerator que devolverá un IEnumerator, cuyo Current método devolverá un Object. Un IEnumerable<T> tiene un método GetEnumerator que devolverá un IEnumerator<T>, cuyo método Current devolverá un T. Si conoce de antemano el tipo esperado del objeto que debe devolver el enumerador, generalmente es mejor usar el formulario genérico.

Otra distinción es que IEnumerator<T> hereda IDisposable, lo que permite que el código que se realiza con un enumerador para llamar Dispose en él sin tener que preocuparse acerca de si es compatible. En comparación, cuando se usa un IEnumerator no genérico, es necesario probar si es IDisposable y llamar al Dispose si es así.Tenga en cuenta que el uso de la forma no genérica de IEnumerable/IEnumerator no libera uno de los requisitos para llamar al Dispose. Como ejemplo, lanzar la Colección vb-style al IEnumerable y luego llamar al GetEnumerator 100.000 veces sin llamar al Dispose será extremadamente lento (muchos segundos, incluso en un i7) a menos que ocurra una recolección de basura. Desechar el IEnumerator después de cada llamada acelerará las cosas más de cien veces.

Cuestiones relacionadas