Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[Tutorial] C# Estructuras[Sencillo]
#1
Tutorial de clases de colección
Visual Studio .NET 2003
Este tutorial muestra cómo implementar una clase de colección que se puede utilizar con la instrucción foreach.

Archivos de ejemplo

Vea Ejemplo de clases de colección para descargar y generar los archivos de ejemplo que se utilizan en este tutorial.

Información adicional

foreach, in
8.8.4 La instrucción foreach
Tutorial de parámetros de la línea de comandos
Tutorial de matrices
Tutorial

La instrucción foreach proporciona un medio muy práctico para iterar en los elementos de una matriz. También puede enumerar los elementos de una colección, siempre que la clase de colección haya implementado las interfaces System.Collections.IEnumerator y System.Collections.IEnumerable.

Ejemplo 1

El siguiente ejemplo de código ilustra cómo escribir una clase de colección que se pueda utilizar con la instrucción foreach. La clase es un analizador de cadenas, similar a la función strtok de la biblioteca de tiempo de ejecución de C.

Código PHP:
// tokens.cs
using System;
// The System.Collections namespace is made available:
using System.Collections;

// Declare the Tokens class:
public class Tokens IEnumerable
{
   private 
string[] elements;

   
Tokens(string sourcechar[] delimiters)
   {
      
// Parse the string into tokens:
      
elements source.Split(delimiters);
   }

   
// IEnumerable Interface Implementation:
   //   Declaration of the GetEnumerator() method 
   //   required by IEnumerable
   
public IEnumerator GetEnumerator()
   {
      return new 
TokenEnumerator(this);
   }

   
// Inner class implements IEnumerator interface:
   
private class TokenEnumerator IEnumerator
   
{
      private 
int position = -1;
      private 
Tokens t;

      public 
TokenEnumerator(Tokens t)
      {
         
this.t;
      }

      
// Declare the MoveNext method required by IEnumerator:
      
public bool MoveNext()
      {
         if (
position t.elements.Length 1)
         {
            
position++;
            return 
true;
         }
         else
         {
            return 
false;
         }
      }

      
// Declare the Reset method required by IEnumerator:
      
public void Reset()
      {
         
position = -1;
      }

      
// Declare the Current property required by IEnumerator:
      
public object Current
      
{
         
get
         
{
            return 
t.elements[position];
         }
      }
   }

   
// Test Tokens, TokenEnumerator

   
static void Main()
   {
      
// Testing Tokens by breaking the string into tokens:
      
Tokens f = new Tokens("This is a well-done program."
         new 
char[] {' ','-'});
      foreach (
string item in f)
      {
         
Console.WriteLine(item);
      }
   }
}
Resultado

This
is
a
well
done
program
.
Descripción del código 

En el ejemplo anterior, Tokens utiliza el siguiente código para descomponer la cadena "This is a well-done program." en símbolos (tokens), utilizando ' ' y '-' como separadores, y para enumerar esos símbolos mediante la instrucción foreach:

Código PHP:
Tokens f = new Tokens("This is a well-done program."
   new 
char[] {' ','-'});
foreach (
string item in f)
{
   
Console.WriteLine(item);

Observe que, internamente, Tokens utiliza una matriz, la cual implementa IEnumerator e IEnumerable. El código podría haber aprovechado los métodos de enumeración de la matriz, pero eso iría en contra del propósito de este ejemplo.

En C#, no es estrictamente necesario que una clase de colección herede de IEnumerable e IEnumerator para que pueda ser compatible con foreach; siempre que la clase disponga de los miembros GetEnumerator, MoveNext, Reset y Current requeridos, funcionará con foreach. Omitir las interfaces tiene la ventaja de permitir definir el tipo devuelto de Current de modo que sea más específico que object, con lo que se consigue seguridad de tipos.

Por ejemplo, al principio del código de ejemplo anterior, cambie las siguientes líneas:

Código PHP:
public class Tokens  // no longer inherits from IEnumerable
public TokenEnumerator GetEnumerator()  // doesn't return an IEnumerator
public class TokenEnumerator  // no longer inherits from IEnumerator
public string Current  // type-safe: returns string, not object 
Ahora, como Current devuelve una cadena, el compilador puede detectar cuándo se utiliza un tipo incompatible en una instrucción foreach:

Código PHP:
foreach (int item in f)  // Error: cannot convert string to int 
El inconveniente de omitir IEnumerable e IEnumerator es que la clase de colección ya no puede interactuar con las instrucciones foreach (o equivalentes) de otros lenguajes compatibles con Common Language Runtime.

Puede combinar lo mejor de ambos enfoques (seguridad de tipos dentro de C# e interoperabilidad con otros lenguajes compatibles con Common Language Runtime) si hereda de IEnumerable e IEnumerator y utiliza implementación explícita de interfaces, como se muestra en el siguiente ejemplo.

Ejemplo 2

Este ejemplo es funcionalmente equivalente al Ejemplo 1, pero proporciona seguridad de tipos adicional en C#, a la vez que mantiene la interoperabilidad con otros lenguajes.

Código PHP:
// tokens2.cs
using System;
using System.Collections;

public class 
TokensIEnumerable
{
   private 
string[] elements;

   
Tokens(string sourcechar[] delimiters)
   {
      
elements source.Split(delimiters);
   }

   
// IEnumerable Interface Implementation:

   
public TokenEnumerator GetEnumerator() // non-IEnumerable version
   
{
      return new 
TokenEnumerator(this);
   }

   
IEnumerator IEnumerable.GetEnumerator() // IEnumerable version
   
{
      return (
IEnumerator) new TokenEnumerator(this);
   }

   
// Inner class implements IEnumerator interface:

   
public class TokenEnumeratorIEnumerator
   
{
      private 
int position = -1;
      private 
Tokens t;

      public 
TokenEnumerator(Tokens t)
      {
         
this.t;
      }

      public 
bool MoveNext()
      {
         if (
position t.elements.Length 1)
         {
            
position++;
            return 
true;
         }
         else
         {
            return 
false;
         }
      }

      public 
void Reset()
      {
         
position = -1;
      }

      public 
string Current // non-IEnumerator version: type-safe
      
{
         
get
         
{
            return 
t.elements[position];
         }
      }

      
object IEnumerator.Current // IEnumerator version: returns object
      
{
         
get
         
{
            return 
t.elements[position];
         }
      }
   }

   
// Test Tokens, TokenEnumerator

   
static void Main()
   {
      
Tokens f = new Tokens("This is a well-done program."
         new 
char [] {' ','-'});
      foreach (
string item in f// try changing string to int
      
{
         
Console.WriteLine(item);
      }
   }

#2
Muy interesante yo estoy empezando a aprender este lenguaje de prog.
#3
Gracias por el aporte.

C# es un lenguaje robusto, aunque en lo personal no lo recomiendo.

¿Porqué?

Pues por el simple hecho de que es un software licenciado.

Prefiero Java, que es libre y corre bajo cualquier sistema operativo.

(29-12-2011, 07:26 AM)light21 escribió: Muy interesante yo estoy empezando a aprender este lenguaje de prog.

Yo te recomiendo que primero aprendas C o C++ que es la base para que en el futuro incursiones en cualquier lenguaje Orientado a Obejetos. Lengua



WWW
#4
Interesante, gracias por compartirlo me sera de ayuda Sonrisa
#5
un consejo: pon el código dentro de las etiquetas code... por otro lado: existiendo java ni a palo toco .net
#6
tema editado para adecuarlo al foro Guiño
WWW
#7
grasias muy bueno el tutorial tu aporte es super bueno
#8
Interesante, creo sigo con este lenguaje jeje...


Posibles temas similares...
Tema Autor Respuestas Vistas Último mensaje
Información [Tutorial] Certificado SSL Gratis StartSSL 2016 Tutorial DarkMaster 26 4,757 28-04-2016, 03:39 AM
Último mensaje: Lob3zNo
Bombilla [Tutorial] SSL Gratis, Conseguir e Instalar Certificado DarkMaster 16 803 06-01-2016, 01:32 AM
Último mensaje: DarkMaster
  [PUBLICO] Tutorial Botones con perspectiva 3D AngelKrak 0 208 17-01-2015, 05:44 AM
Último mensaje: AngelKrak
  Curso C++: 6.- Estructuras cíclicas, while, do while y for Samo30 0 1,329 16-06-2014, 01:28 AM
Último mensaje: Samo30
  Curso C++: 5.- Estructuras de selección if y switch Samo30 5 496 11-06-2014, 08:48 PM
Último mensaje: MPH
  [Tutorial] Aumentar el Tamaño Máximo al Cargar Archivos con PHP y Apache papanoel 0 646 22-01-2014, 04:38 AM
Último mensaje: papanoel
  [PHP] Estructuras If, else y elseif torgar22 0 218 07-05-2013, 01:31 PM
Último mensaje: torgar22
  Tutorial Css Primera Parte para phpost JNeutron 4 1,021 24-02-2013, 04:01 AM
Último mensaje: Echizen
  [TUTORIAL] Conexión a una Base de Datos desde [PHP] lapipichapa 0 475 15-02-2013, 05:52 PM
Último mensaje: lapipichapa
  Tutorial de .htaccess | Control de acceso a carpetas diringax 11 1,418 13-01-2013, 12:28 PM
Último mensaje: papi



Usuarios navegando en este tema: 1 invitado(s)