enumeraciones

14/04/2005 - 14:58 por Kone | Informe spam
Hola, intento guardar unos elementos en una estructura d tal forma q pueda
accederlos mediante un indice. Habia pensado en una enumeracion pero no doy
con la forma d acceder d forma indexada, si existe.

salu2 y gracias

Preguntas similare

Leer las respuestas

#1 Tristan
15/04/2005 - 11:20 | Informe spam
No acabo de entender bien tu pregunta.

¿Quieres acceder mediante una clave a una lista de
elementos?. Para eso debes utilizar un diccionario, por
ejemplo la clase HashTable. Si lo quieres tipado crea un
derivado de DictionaryBase

Si por el contrario accederás por índice numérico, puedes
usar un Array, ArrayList o un derivado de CollectionBase.
Respuesta Responder a este mensaje
#2 Tristan
15/04/2005 - 11:29 | Informe spam
No acabo de entender a que te refieres, Eduardo. Puesto
que los enumerados se comportan como enteros si pueden
utilizarse como índice de un array.

¿O te refieres a que no se comporta de forma fuertemente
tipada?
Respuesta Responder a este mensaje
#3 Eduardo Diaz
15/04/2005 - 15:44 | Informe spam
De hecho son fuertemente tipados, pero les falta cierto comportamiento.
Por ejemplo, en Pascal yo hago:

type


"Tristan" wrote:

No acabo de entender a que te refieres, Eduardo. Puesto
que los enumerados se comportan como enteros si pueden
utilizarse como índice de un array.

¿O te refieres a que no se comporta de forma fuertemente
tipada?

Respuesta Responder a este mensaje
#4 Eduardo Diaz
15/04/2005 - 15:57 | Informe spam
De hecho son fuertemente tipados, los enums derivan System.Enum, lo que pasa
es que no los puedo usar en forma natural como indexadores de un arreglo, por
ejemplo:


1 enum Colores { Rojo, Verde, Azul }
2 int[] valores = { 0xff0000, 0x00ff00, 0x0000ff };
3 for (Colores col = Colores.Rojo; col <= Colores.Azul; col++)
4 {
5 Console.WriteLine(" color {0} = {1}", col, valores[col]); // <<-- no
pasa compilacion
6 Console.WriteLine(" color {0} = {1}", col, valores[(int)col]);
7 }

La linea 5 no compila porque al ser fuertemente tipado, hay que hacer un
boxing a tipo int para transformar col a integer, que es el unico tipo valido
de indexador de un arreglo.
Es mas, si en colores defino Rojo=-1, el programa se cae porque los arreglos
parten desde 0.

En C++ no pasa esto, por que enum e int son equivalentes.
En pascal yo puedo declarar un arreglo asi:
a : array[Colores] of integer

Esto puede ser util en algunas aplicaciones, en que conviene que los
arreglos se puedan indexar por otro tipo de rangos, por ejemplo, desde -10 a
10.

En ese sentido, C# sigue sufriendo de los problemas de todos los derivados
de C.

"Tristan" wrote:

No acabo de entender a que te refieres, Eduardo. Puesto
que los enumerados se comportan como enteros si pueden
utilizarse como índice de un array.

¿O te refieres a que no se comporta de forma fuertemente
tipada?

Respuesta Responder a este mensaje
#5 Tristan
16/04/2005 - 01:40 | Informe spam
La linea 5 no compila porque al ser fuertemente tipado, hay que hacer un
boxing a tipo int para transformar col a integer, que es el unico tipo
valido
de indexador de un arreglo.
Es mas, si en colores defino Rojo=-1, el programa se cae porque los
arreglos
parten desde 0.



Bueno, supongo que más que un boxing te refieres a un casting. ¿No?. Si, eso
es lo que no te había entendido. Pero es cierto, hay que añadir la
conversión int.

Es mas, si en colores defino Rojo=-1, el programa se cae porque los
arreglos
parten desde 0.



Si, claro, y eso está relacionado con lo que yo quería decir con que no
funciona de forma fuertemente tipado. No hay forma de forzar a que los
valores del índice coincidan con los del tipo enumerado y no hay forma de
garantizar que los valores del enumerado sean válidos como índice.

En fin, dudo mucho que esto cambie en un futuro. Me da que complicaría el
compilador sin obtener demasiada ventaja en casos reales. Pero tal vez me
equivoque. Solo se que la simplicidad en lenguajes se considera una virtud,
y que C es bastante posterior a Pascal.

Juan Carlos Badiola
MVP - C#
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida