jueves, 10 de agosto de 2017

Enumeración e Interfaces IEnumerator e IEnumerable en C#

Índice

1. Introducción
2. Palabras Clave
3. Interfaz IEnumerable
4. Interfaz IEnumerator
5. Clase String
6. Ejemplo de Uso: Listar Nombres
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

En este artículo el programador C# aprenderá a distinguir la utilidad de dos interfaces fundamentales para implementar el recorrido de los elementos de una colección: IEnumerable y IEnumerator. Estas interfaces proveen los contratos de implementación que deben cumplir las estructuras de datos o colecciones para explorar su contenido a través del ciclo mejorado foreach.

2. Palabras Clave

  • Colección
  • Contrato
  • Enumeración
  • Estructura de datos
  • Interfaz

3. Interfaz IEnumerable

Este elemento de programa es una interfaz que expone un contrato de enumeración sobre colecciones o estructuras de datos no genéricas. En concreto, una colección debe escribir una implementación particular para el método GetEnumerator para devolver un elemento IEnumerator, el cual describe la lógica de recorrido.

Respecto a esta clase, hay que tener en cuenta la observación hallada en "IEnumerable Interface" (2017):
"It is a best practice to implement IEnumerable and IEnumerator on your collection classes to enable the foreach [...] syntax, however implementing IEnumerable is not required."
Esta consideración es importante a razón de que el programador puede omitir la implementación de IEnumerable y directamente utilizar la implementación de IEnumerator para hacer de una estructura de datos enumerable. Toda la lógica de recorrido se puede escribir en un tipo de dato que implemente esta última interfaz.

Sin embargo, en (Albahari, 2012) se considera a IEnumerable como un proveedor de enumeración o "IEnumeratorProvider". Lo que facilita exponer la lógica de recorrido en una clase/archivo independiente, pero sobretodo permite a diferentes secciones o locaciones de código hacer el recorrido de la colección sin interferir una con otra.

4. Interfaz IEnumerator

IEnumerator es un contrato o interfaz que dicta a un tipo de dato los métodos y propiedades que debe implementar para facilitar el recorrido de los elementos contenidos en la colección.

Los miembros que se deben implementar son los siguientes:
  • Propiedades:
    • Current: retorna el elemento de la posición actual de la colección.
  • Métodos:
    • MoveNext: mueve el índice a la siguiente posición de la colección.
    • Reset: posiciona el índice antes del primer elemento de la colección.
Al igual que la interfaz IEnumerable, IEnumerator está orientado para tipos de datos no genéricos. Para tipos de datos genéricos, el namespace System.Collections.Generic define las interfaces análogas IEnumerable<T>IEnumerator<T>.


En la Figura 1 (Albahari, 2012) se ilustra un esquema visual sobre la estructuración de estos tipos en .NET Framework:
Esquema de interfaces para colecciones
Figura 1. Esquema de interfaces para colecciones.

5. String

La clase String (namespace System) implementa la interfaz IEnumerable para enumerar cada uno de sus elementos: los caracteres que la integran:
Definición clase String
Figura 2. Definición clase String ("String Class", 2017).

Nótese en la imagen como esta clase implementa las versiones no-genéricas y genéricas de estas interfaces. En el próximo artículo se presenta la versión genérica de este tipo de protocolo o interfaz.

6. Ejemplo de Uso

El siguiente ejemplo de uso comprende 4 archivos de código fuente C# que demuestra cómo implementar las clases IEnumerable y IEnumerator para enumerar los elementos de una colección que contiene entidades Persona:
  • Persona.cs: Contiene la definición de la entidad que representa una persona con su nombre y apellido.
  • Gente.cs: Implementa la interfaz IEnumerable para retornar un objeto GenteEnumerator.
  • GenteEnumerator.cs: Implementa la interfaz IEnumerator con la lógica necesaria para desplazarse por cada uno de los elementos de la clase Persona.
  • App.cs: Código cliente que pone a prueba la enumeración de elementos de una colección de objetos Persona.
Archivo Gente.cs [enlace alternativo]:

Archivo GenteEnumerator.cs [enlace alternativo]:

Archivo App.cs [enlace alternativo]:

Para compilar este código basta con ejecutar el siguiente comando a través del compilador de C#:

csc /out:App.exe *.cs

La ejecución se lleva a cabo con:

./App.exe

El resultado de ejecutar esta aplicación es:

Fyodor Dostoevsky
Honoré Balzac

Charles Dickens

7. Conclusiones

Se presentaron las interfaz IEnumerable y IEnumerator. Se describió su utilidad para enumerar elementos de una colección o estructura de datos. Estas interfaces son protocolos estándar definidos en .NET Framework que permiten al programador C# sacar máximo provecho de los elementos estándar del lenguaje: el ciclo foreach.

En el siguiente artículo se explorarán las versiones análagas en genéricos de estas dos interfaces: IEnumerable<T> y IEnumerator<T>.

8. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
IEnumerable Interface (System.Collections) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.collections.ienumerable(v=vs.110).aspx
String Class (System) (2017). Recuperado desde:
https://msdn.microsoft.com/en-us/library/system.string(v=vs.110).aspx


O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.