Colecciones personalizadas...

01/07/2004 - 19:56 por Kravek | Informe spam
Qúe método debo sobreescribir y como para que al heredar de un SortedList me
funcione el "for each"?

Yo lo intento así pero me da error de conversión de tipos:

Public Shadows Property Item(ByVal key As Integer) As Entidad

Get

Return CType(MyBase.Item(key), Entidad)

End Get

Set(ByVal Value As Entidad)

MyBase.Item(key) = Value

End Set

End Property

Public Shadows Property Item(ByVal E As Entidad) As Entidad

Get

Return CType(MyBase.Item(E), Entidad)

End Get

Set(ByVal Value As Entidad)

MyBase.Item(E) = Value

End Set

End Property

Preguntas similare

Leer las respuestas

#1 Tristan
01/07/2004 - 21:12 | Informe spam
Para que una clase sea accesible mediante ForEach, debe implementar el
interface IEnumerable. Debes añadir a tu clase un método GetEnumerator que
devuelve a su vez el enumerador del SortedList.

De todas formas, yo utilizaría otro enfoque puesto que Shadows es algo que
evitaría siempre. Prueba esta clase:

Class StringSortedList
Implements IEnumerable

Private lista As New SortedList

Public Sub Add(key As Integer, value As String)
lista.Add(key, value)
End Sub

Default Public Property Item(key As Integer) As String
Get
Return lista(key).ToString()
End Get
Set(ByVal Value As String)
lista(key) = Value
End Set
End Property

Public Function GetEnumerator() As IEnumerator Implements
IEnumerable.GetEnumerator
Return lista.GetEnumerator()
End Function
End Class

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#2 Tristan
01/07/2004 - 21:15 | Informe spam
Por cierto, no olvides que SortedList se recorre mediante un
DictionaryEntry.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#3 Guillermo guille
02/07/2004 - 00:16 | Informe spam
por tanto... si quieres que se recorra por las claves, puedes hacer esto:

Public Function GetEnumerator() As IEnumerator Implements
IEnumerable.GetEnumerator
Return lista.Keys.GetEnumerator()
End Function

Y si quieres recorrerla por los valores:

Public Function GetEnumerator() As IEnumerator Implements
IEnumerable.GetEnumerator
Return lista.Values.GetEnumerator()
End Function

Pero... esto en ocasiones son ganas de rizar el rizo...

Nos vemos.
Guillermo
Microsoft VB MVP desde 1997
Te invito a mi sitio dedicado al VB y más...
http://www.elguille.info/
http://www.mundoprogramacion.com/
(puede que el correo usado sea anti-spam)
Respuesta Responder a este mensaje
#4 Kravek
02/07/2004 - 03:01 | Informe spam
Lo tuyo reconozco que me gusta más que lo mío pero el problema es que estas
clases de colección las hago como envolventes a mi jerarquía de clases y
mediante el uso de shadows lo que hacía era ir heredando de igual manera las
clases coleccion.

Ejemplo:
Entidad
Pedido
Producto
ProductoTipo1
ProductoTipo2
...
...

Y por otro lado:
Entidades
Pedidos
Productos
ProductosTipo1
ProductosTipo2
...
...




"Tristan" escribió en el mensaje
news:
Para que una clase sea accesible mediante ForEach, debe implementar el
interface IEnumerable. Debes añadir a tu clase un método GetEnumerator que
devuelve a su vez el enumerador del SortedList.

De todas formas, yo utilizaría otro enfoque puesto que Shadows es algo que
evitaría siempre. Prueba esta clase:

Class StringSortedList
Implements IEnumerable

Private lista As New SortedList

Public Sub Add(key As Integer, value As String)
lista.Add(key, value)
End Sub

Default Public Property Item(key As Integer) As String
Get
Return lista(key).ToString()
End Get
Set(ByVal Value As String)
lista(key) = Value
End Set
End Property

Public Function GetEnumerator() As IEnumerator Implements
IEnumerable.GetEnumerator
Return lista.GetEnumerator()
End Function
End Class

Juan Carlos Badiola
MVP - C#


Respuesta Responder a este mensaje
#5 Tristan
02/07/2004 - 08:16 | Informe spam
Pero no se en que afecta lo que te he dicho. No olvides que puedes incluir
herencia simple y múltiples interfaces en una misma clase. ¿O hay algo que
se me escapa?

Incluso podrías seguir con inherits SortedList y Shadows, pero no olvides
que los miembros "escondidos" con Shadows solo serán visibles desde la clase
hacia sus descendientes, y no para el for each. Además, chocarás con una de
las carencias importantes de vb.net, tendrías que crear tu clase en C#. En
vb.net, NO se puede reimplementar una interface, así es que no podrás volver
a implementar IEnumerable ni IEnumerator en una clase descendiente de
SortedList.

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