La clase LinkedNode en C#. Interfaz Ilist

Mar 30, 2009 Codigos C# Tutoriales C# 5 comentarios

Las listas (List) en C# son colecciones de datos mucho más potentes y funcionales que los arrays, por lo que su uso es muy común en el desarrollo de aplicaciones. Y es que con las listas (List) todo se hace mucho más sencillo. Ahorramos código y disponemos de los métodos que siempre soñamos tener en la clase Array.

En este tutorial veremos como crear nuestra propia lista de elementos usando nodos enlazables, así como programar los métodos Add, Insert, Remove, IndexOf, Contains, Clear y otras funciones disponibles en la Interfaz IList.

¿Qué es un nodo enlazable?
Un nodo enlazable es una clase que tiene principalmente un valor de tipo object y un enlace hacia el nodo siguiente.

¿Para que sirve?
Los nodos enlazables pueden ser utilizados para almacenar los elementos de la lista que queremos crear. De igual manera podríamos usar un array, pero además de ser mucho más costoso, a mí me gustan más los nodos enlazables.

Por tanto esta sería la clase Nodo:

img1 La clase LinkedNode en C#. Interfaz Ilist

Ahora que ya tenemos nuestra clase Nodo, crearemos nuestra lista. Una clase a la que llamaremos ListaEnlazable. Como todas, las listas van a tener las mismas funcionalidades, las que heredaremos de una interfaz llamada IList.

Para quienes no lo saben, una interfaz es una especie de plantilla, con un conjunto de métodos y propiedades definidas pero no programadas y que las podemos usar en clases y estructuras.

Para usar la interfaz Ilist creamos la clase ListaEnlazable y heredamos de la interfaz Ilist que viene por defecto con el Visual Studio. Luego hacemos clic derecho sobre Ilist y seleccionamos Implementar Interfaz (Implement interface):

img2 La clase LinkedNode en C#. Interfaz Ilist

Pues bien, ahora vamos a crear las variables necesarias para programar cada uno de los métodos de la interfaz Ilist.

Necesitaremos dos Nodos: primero y último, para poder recorrer la lista, y empezar desde algún lugar. Además podríamos necesitar un contador, que permita saber la cantidad de elementos que hay en un momento dado. Y el constructor por defecto lo único que haría es inicializar las variables, para crear una nueva ListaEnlazable vacía. De esta forma, tendríamos algo como lo siguiente:

img3 La clase LinkedNode en C#. Interfaz Ilist

public void Add(object x)

La función de este método es añadir un elemento al final de la lista. Veamos la implementación de Add:

img4 La clase LinkedNode en C#. Interfaz Ilist

Como ven, es muy sencillo, solo hay que crear un nuevo nodo, enlazar el último con este nuevo nodo y luego poner este nodo como último.

public void Insert(int index, object x)

Añade un elemento a la lista, pero a diferencia de Add(object x), este lo inserta en una posición dada.

img5 La clase LinkedNode en C#. Interfaz Ilist

Como ven, hay que recorrer la lista hasta encontrar la posición donde queremos insertar el elemento.

public int IndexOf(object x)

Devuelve la posición de un elemento de la lista.

img6 La clase LinkedNode en C#. Interfaz Ilist

Al final, si este método no encuentra el elemento x en la lista, retorna -1, veamos como usar esto en el siguiente método.

public bool Contains(object x)

Este método nos dice si un elemento está o no en la lista. Devuelve true en caso de que la lista contenga al elemento x y false en caso contrario.

img7 La clase LinkedNode en C#. Interfaz Ilist

La operación es muy simple, pues usamos IndexOf(x) que ya está implementado en esta clase.

public void Remove(object x)

Método para quitar el elemento x de la lista. Simplemente busca el elemento en la lista y actualiza la propiedad siguiente saltándose el nodo cuyo valor es x.

img8 La clase LinkedNode en C#. Interfaz Ilist

Nos quedan dos métodos que deberás implementar tú mismo, usando los algoritmos que ya hemos visto en la clase ListaEnlazable:

public void RemoveAt(int index)

Elimina de la lista el elemento que está en la posición index.

Public void Clear()

Clear no recibe ningún parámetro y su función es reiniciar la lista, o sea vaciarla. Fíjense en el constructor.

Public object this [int index]

Por último, veamos cómo programar el indexer, una especie de propiedad que permite seleccionar el elemento de la lista especificando una posición, como hacemos con el array, por ejemplo:

img9 La clase LinkedNode en C#. Interfaz Ilist

No se asusten porque el código es un poco largo, fíjense que es casi lo mismo en el get y en el set, la diferencia está en que get es para leer el elemento, y set para cambiarlo.

img101 La clase LinkedNode en C#. Interfaz Ilist

Bueno, hasta aquí este post. Si tienen alguna duda o quieren agregar algo, ya saben… comenten. Ahora estoy resolviendo unos cuantos ejercicios en C# para publicarlos aquí pronto.

Ah, se me olvidada, subí la clase LinkedNode y la pueden descargar desde aquí.

Compartir:

5 comentarios

Forma parte de nuestra discusión y síguela de cerca

estuvo muy bueno este ejemplo, de verdad te quedo super eficiente el algoritmo, sobre todo el Add, al metodo Remove le falto disminuirle el count.

Autor: two_d | Fecha: May 11, 2009.

[...] Por supuesto, le faltan algunos métodos de la interfaz ICollection, pero esos ya los vimos cuando hablamos de  la clase LinkedNode en C# y la Interfaz Ilist. [...]

Autor: Estructuras de C#. Pila (Stack) | PuntoPeek.com | Fecha: Jul 18, 2009.

Podrias mostrarme el ejemplo completo?? para entender mejor los temas??

Autor: Mario | Fecha: Feb 16, 2011.

muy buena introduccion a la clase List.
Lo voy a aplicar como sustituto de punteros, para ver que sale

Autor: adrian | Fecha: Dic 13, 2011.

Pero alliíno veo que realices ningun remove…

O sea has implementado un Remove() propio, donde recorres un contador que no se sabe de donde sale, y también afectas a ninguna otra lista quitandole el item…
Cuando detectas el item que debe removerse, ¿cómo lo quitas de la lista interna de la clase que estas creando?
¡Saludos!

Autor: FALK | Fecha: Jun 6, 2013.

Escribe tu comentario

Requerido.

Requerido. No público.

Si tienes alguno.