2010-08-26 11 views
8

¿Alguien puede describir IEnumerable y cuál es la diferencia entre IEnumerable y la matriz y dónde usarla ... toda la información sobre ella y cómo usarla.¿Cuál es la diferencia entre IEnumerable y matrices?

+1

Enums = http://msdn.microsoft.com/en-us/library/9b9dty7d%28VS.80%29.aspx Arrays = http://msdn.microsoft.com/en-us/ library/9b9dty7d% 28VS.80% 29.aspx – w69rdy

+1

@ w69rdy - Creo que quiso decir la diferencia entre IEnumerable y array. –

Respuesta

11

Una matriz es una colección de objetos con un tamaño de conjunto.

int[] array = [0, 1, 2]; 

Esto hace que sea muy útil en situaciones en las que es posible que desee acceder a un elemento en un punto particular en la colección ya que la ubicación en la memoria de cada elemento ya conocido por

array[1]; 

Además, el el tamaño de la matriz se puede calcular rápidamente.

IEnumerable, por otro lado, básicamente dice que, dada la posición de inicio, es posible obtener el siguiente valor. Un ejemplo de esto puede ser una serie infinita de números:

public IEnumerable<int> Infinite() 
{ 
    int i = 0; 
    while(true) 
     yield return i++; 
} 

A diferencia de una matriz una colección enumerable puede ser de cualquier tamaño y es posible crear los elementos, ya que se requieren, en lugar de por adelantado, esto permite potente construye y es ampliamente usado por LINQ para facilitar consultas complejas.

//This line won't do anything until you actually enumerate the created variable 
IEnumerable<int> firstTenOddNumbers = Infinite().Where(x => x % 2 == 1).Take(10); 

Sin embargo, la única manera de obtener un elemento específico es comenzar desde el principio y enumerar hasta el que desee. Esto será considerablemente más caro que obtener el elemento de una matriz pregenerada.

Por supuesto, puede enumerar a través de una matriz, por lo que una matriz implementa la interfaz IEnumerable.

+2

+1 Respuesta completa ... aunque 2147483647 no es infinito. ;) –

+7

@djacobson It * is * infinite, simplemente no es contiguo. El siguiente valor es -2147483648 ... :) –

+0

El infinito depende de la configuración del compilador. – nawfal

2

Una matriz es una colección de datos. Está implícito que los artículos se almacenan de manera contigua y son directamente aptos.

IEnumerable es una descripción de una recopilación de datos. No son colecciones en sí mismas. Específicamente, significa que la colección se puede pasar, un elemento a la vez.

SI define un varable como tipo IEnumerable, puede hacer referencia a una colección de cualquier tipo que se ajuste a esa descripción.

Las matrices son enumerables. Lo mismo ocurre con las Listas, los Diccionarios, los Conjuntos y otros tipos de colecciones. Además, las cosas que no parecen ser una colección pueden ser Enumerable, como una cadena (que es IEnumerable<char>), o el objeto devuelto por Enumerable.Range(), que genera un nuevo elemento para cada paso sin siquiera mantenerlo en alguna parte.

1

Una cosa es que las matrices permiten el acceso aleatorio a un contenido de tamaño fijo. Donde la interfaz IEnumerable proporciona los datos secuencialmente, que puede extraer de IEnumerable a la vez hasta que se agote la fuente de datos.

3

.NET tiene su interfaz IEnumerable mal llamada - debe ser Ilterable. Básicamente, System.Collection.IEnumerable o (desde genéricos) System.Collection.Generic.IEnumerable le permite utilizar foreach en el objeto que implementa estas interfaces.

(Nota al margen: en realidad está utilizando .NET duck typing foreach, por lo que no son necesarios para implementar estas interfaces - es suficiente si proporciona las implementaciones de métodos adecuados.)

Un array (Sistema.Array) es un tipo de secuencia (donde por secuencia quiero decir una estructura de datos iterable, es decir, cualquier cosa que implemente IEnumerable), con algunas diferencias importantes.

Por ejemplo, un IEnumerable puede cargarse, y a menudo es, lento. Eso significa que hasta que no itere explícitamente sobre él, los elementos no se crearán. Esto puede llevar a un comportamiento extraño si no estás enterado. Como consecuencia, un IEnumerable no tiene medios para decirle cuántos elementos contiene hasta que realmente itere sobre él (lo que hace el método de extensión Count en la clase System.Linq.Enumerable).

Una matriz tiene una propiedad de longitud, y con esto hemos llegado a la diferencia más importante: una matriz si una secuencia de elementos fijos (y conocidos). También proporciona un indexador, por lo que puede acceder cómodamente a sus elementos sin tener que iterar sobre él.

Y solo para el registro, las enumeraciones "reales" en .NET son tipos definidos con la palabra clave enum. Te permiten expresar tus elecciones sin usar números mágicos o cadenas. También se pueden usar como banderas, cuando se marcan con FlagsAttribute.

Le sugiero que use su motor de búsqueda de favoritos para obtener más detalles sobre estos conceptos: mi breve resumen claramente no tiene como objetivo proporcionar una visión profunda de estas características.

+1

La terminología utilizada en .Net está perfectamente bien. De http://en.wikipedia.org/wiki/Enumeration: "En matemáticas y ciencias informáticas teóricas, la definición más amplia y abstracta de una enumeración de un conjunto es una lista exacta de todos sus elementos". Lo que ustedes llaman enumeraciones "reales" se conocen más apropiadamente como "tipos enumerados": http://en.wikipedia.org/wiki/Enumerated_type – Gabe

2

Arrays

matriz A .Net es una colección de múltiples valores almacenados consecutivamente en la memoria. Los elementos individuales en una matriz pueden ser accedidos aleatoriamente por índice (y hacerlo es bastante eficiente). importantes miembros de una matriz son:

  • this[Int32 index] (operador de indexación)
  • Length

C# ha incorporado en el soporte para las matrices y pueden ser inicializado directamente de código:

var array = new[] { 1, 2, 3, 4 }; 

Las matrices también pueden ser multidimensionales e implementar varias interfaces incluyendo IEnumerable<T> (donde T es el tipo de elemento de la matriz).

IEnumerable <T>

La interfaz IEnumerable<T> define el método GetEnumerator() pero ese método se utiliza muy poco directamente. En cambio, el bucle foreach se utiliza para iterar a través de la enumeración:

IEnumerable<T> enumerable = ...; 
foreach (T element in enumerable) 
    ... 

Si la enumeración se realiza sobre una matriz o una lista de todos los elementos en existe la enumeración durante la enumeración pero también es posible enumerar los elementos que son creado sobre la marcha. La construcción yield return es muy útil para esto.

Es posible crear una matriz a partir de una enumeración:

var array = enumerable.ToArray(); 

Esto hará que todos los elementos de la enumeración y almacenarlos de forma consecutiva en una sola matriz.

Para resumir:

  • Las matrices son colección de elementos que se puede acceder aleatoriamente por el índice
  • enumeraciones son abstracción sobre una colección de elementos que se puede acceder una después de la otra en un movimiento hacia adelante de manera
Cuestiones relacionadas