Blog post image

Estructuras de datos en .NET con C#

AuthorGenesis Rivera Rios
Date
12/8/2020
Time5 min read

Las estructuras de datos son muy importantes a la hora de aprender a programar ya que estas nos ayudan a cumplir con el propósito del código que escribimos.

¿Que son estructuras de datos?

Las estructuras de datos son formas de almacenar/organizar datos.

Por ejemplo guardamos una pizza en una caja porque es más conveniente transportarla de esta forma comparada con algo como transportar una pizza utilizando un tanque de pescados lo cual seria muy incomodo.

Fish and pizza

Un buen programador sabe identificar que estructura de datos les va a hacer la vida más fácil en momentos específicos a la hora de escribir código y siempre es bueno también tomar en consideración como una estructura de datos va a desempeñarse en cuanto a rendimiento comparada con otra.

¿A que me refiero con esto? Por ejemplo tal vez podemos acceder la data de un Array más rápido que la de una lista pero a la hora de insertar elementos nuevos una lista tendría mejor desempeño.

Algunas estructuras de datos nativas en .NET

Cuando digo nativas me refiero a que el framework de .NET nos da la opción de utilizar estas estructuras de datos importando ciertos namespaces, algunos lenguajes de programación no tiene la capacidad de utilizar estas estructuras nativamente y el programador tiene que escribirlas el mismo desde cero.

Queue

QUEUE

Si has utilizado aplicaciones de música como Spotify o Pandora ya debes tener una idea de lo que es un Queue. Cuando dices pon una canción en el QUEUE estamos añadiendo una canción a una colección de canciones que tocan en orden en el cual están siendo añadidas. A esta forma de accesar/almacenar datos se le llama FIFO (First In First Out).

Ahora veamos cómo podemos utilizar un QUEUE en C#.

La clase QUEUE vive en el namespace System.Collections así que para poder utilizarla debemos importarlo. Para comenzar a utilizarla podemos crear una nueva instancia y guardarla en una variable, opcionalmente podemos asignarle un tamaño.

var queue = new Queue();

También podemos crear strongly typed QUEUEs a los cuales les especificamos el tipo de data que va a almacenar.

var queue = new Queue<Artist>();

Cuando se le añaden elementos a un QUEUE esto se llama ENQUEUE, lo cual es un método al que le pasamos un valor para añadir a la colección.

Por ejemplo, para añadirle un valor a nuestro QUEUE que almacena artistas podemos hacerlo de esta forma.

    queue.Enqueue(new Artist 
    { 
        GenreId ="Neue Deutsche Härte", 
        Name= "Rammstein",
        RecordId = 1 
    });
    queue.Enqueue(new Artist 
    { 
        GenreId ="Neue Deutsche Härte", 
        Name= "OOMPH!",
        RecordId = 2
    });
    queue.Enqueue(new Artist 
    { 
        GenreId ="Neue Deutsche Härte", 
        Name= "Eisbrecher",
        RecordId = 3 
    });

Ahora si iteramos nuestra colección utilizando un for loop podemos ver nuestros valores en el mismo orden en el que los añadimos.

foreach (var artist in queue)
{
    Console.WriteLine($"Name: {artist.Name}, Genre: {artist.GenreId}");
}

Los resultados:

Name: Rammstein, Genre: Neue Deutsche Härte
Name: OOMPH!, Genre: Neue Deutsche Härte
Name: Eisbrecher, Genre: Neue Deutsche Härte

Podemos utilizar los métodos Peek y Dequeue para ver el primer elemento de nuestro QUEUE la única diferencia entre ellos es que Deqeue remueve el elemento a la vez que lo devuelve.

queue.Peek();
queue.Dequeue();

Si volvemos a iterar nuestra lista después del método de Deqeue vamos a ver que solamente nos devuelve dos resultados ya que el primer elemento de nuestro queue fue removido.

Name: OOMPH!, Genre: Neue Deutsche Härte
Name: Eisbrecher, Genre: Neue Deutsche Härte

Array

Colección ordenada de elementos los cuales tienen un índice identificador.

Array example

Muchas de las estructuras de datos que utilizamos son en realidad Arrays con funcionalidades añadidas, los Arrays son como el papa o mama de las demás estructuras de datos.

Cuando utilizamos Arrays en C# debemos especificar el tamaño al momento de crear una nueva instancia.

var artistArray = new Artist[4];

Los Arrays siempre llevan un orden y comienzan por el índice número cero, por eso se dice que son “Cero based index arrays”.

artistArray[0] = new Artist
{
    Name = "Hayley kioko",
    GenreId = "Pop",
    RecordId = 4
};

artistArray[1] = new Artist
{
    Name = "Glass animals",
    GenreId = "Vaporwave idk",
    RecordId = 5
};

Como con el QUEUE podemos iterar sobre el Array y ver los valores que contiene.

En este caso ya que solamente le añadí al Array dos valores voy a escribir un chequeo por valores nulos.

foreach (var artist in artistArray)
{
    if (artist == default) continue;
    Console.WriteLine(artist.Name);
}

Aquí solamente escribo el nombre de cada artista en la consola.

Hayley kioko
Glass animals

Si trato de añadir un valor en un indice mayor al especificado cuando creamos nuestro Array recibiremos un error del compilador.

artistArray[5] = new Artist
{
    Name = "Error",
    GenreId = "This shouldn't work",
    RecordId = 5
};

Error: System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'

Podemos conseguir acceso a elementos de nuestro Array utilizando su índice.

var hayleyKioko = artistArray[0];

En el caso que no sepamos el tamaño de la colección con la que estamos trabajando podemos utilizar…

List

var artistList = new List<Artist>();

Las listas en C# utilizan Arrays “under the hood” pero fueron optimizadas para el uso en el caso de que no se sepa el tamaño final de la lista. El uso de las listas es bastante straight forward.

Con una lista podemos fácilmente copiar los valores de un Array.

artistList.AddRange(artistArray);

Luego de copiar los valores a la lista podemos iterar sobre ellos tomando en cuenta que copiamos también los nulos.

artistList.ForEach(x => Console.WriteLine(x?.Name));

Así que veremos los resultados con espacio ya que hay 3 espacios en el Array sin valor y lo copiamos a la lista.

Hayley kioko
Glass animals

Para añadirle un valor a la vez a la lista podemos utilizar el método de Add()

artistList.Add(new Artist
{
    Name = "Halestorm",
    GenreId = "Rock",
    RecordId = 6
});

Las listas tienen muchos métodos que las hacen de gran ayuda a la hora de programar.

var halestorm = new Artist
{
    Name = "Halestorm",
    GenreId = "Rock",
    RecordId = 6
};
//podemos anadir con add
artistList.Add(halestorm);

//Podemos verificar la cantidad total en nuestra coleccion.
Console.WriteLine($"Artist list count: {artistList.Count}");

//Podemos verificar si algun valor especifico existe.
Console.WriteLine($"Does the list contain halestorm?: {artistList.Contains(halestorm)}");

//Encontrar objetos por propiedades especificas
Console.WriteLine($"Find by Record id: {artistList.Find(x=> x?.RecordId == 6).Name}");

Resultados:

Artist list count: 5
Does the list contain halestorm? : True
Find by Record id: Halestorm

Stack

Piensa en un montón de pancakes uno encima del otro!, tienes hambre? Muy bien.

Stack example

var stack = new Stack<Pancake>();

Un Stack se crea igual que una lista o QUEUE. Los Stacks son LIFO asi que como una pila de pancakes el último que pones encima es el primero que sacas.

Tiene métodos para añadirle valores. En este caso push.

stack.Push(new Pancake
{
    Name ="Chocolate chips",
    Size = Pancake.SizeEnum.TooSmall,
    Syrup = "Maple Syrup"
});
//Pop para remover el último elemento que fue añadido a nuestro stack.
stack.Pop();

//Peek para ver el ultimo elemento que añadimos.
stack.Peek();

Estas son algunas estructuras de datos que podemos utilizar en .NET. Hay muchas otras disponibles para nosotros pero estas fueron algunas de las que quise hablar.

Categoria: csharpdotnet