Newsgrupos.com  

Retroceder   Newsgrupos.com > Forum > Newsgroup microsoft.public.es.* 1 Foro > Newsgroup microsoft.public.es.dotnet.vb
Registrarse Preguntas Frecuentes Lista de Foreros Calendario Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
LinkBack Herramientas Desplegado
  #1 (permalink)  
Antiguo 19-02-2008, 18:38:14
L. Garcia
 
Mensajes: n/a
Predeterminado Dictionary, ArrayList ó ...

Hola de nuevo:

Estudiando que objeto utilizar para simular el collection de VB6, me
encontre con varias opciones y me quede con el objeto Dictionary(Of String,
Object), puesto que me permitia indicar el elemento por una clave tipo
string y a la vez el valor es del tipo que yo quiero, evitando los problemas
de definirlo como Object.

Hasta aqui todo bien hasta que me he puesto a jugar con un problema que
tengo, y no puedo solucionarlo, el problema es muy sencillo:

Lleno un diccionario con Objetos, luego recorro los objetos existentes, y
dependiendo de los valores de los existentes, puedo añadir mas objetos al
mismo diccionario.

Para recorrer el Diccionario, utilizo un bucle For Each, pero al añadir un
objeto al diccionario dentro del For Each, me salta el siguiente error:

"Colección Modificada"

Pero si intento recorrer el Diccionario basandome en el numero de elementos
y su indice, pues no puedo !!!

¿ Existe alguna otra System.Collection que permita el acceso tanto por 'Key'
como por Posicion a la collecion ?

¿ Alguna recomendacion en vez de usar Dictionary ?

Saludos y gracias por leer hasta aquí






Responder Con Cita
Alt Today
Advertising
Google Adsense
 
This advertising will not be shown
in this way to registered members.
Register your free account today
and become a member on
Newsgrupos.com
Standard Sponsored Links

  #2 (permalink)  
Antiguo 19-02-2008, 19:05:42
L. Garcia
 
Mensajes: n/a
Predeterminado Re: Dictionary, ArrayList ó ... (Ejemplo)

Por si alguien quiere probarlo (VB.NET 2005):

Un formulario con un ListBox y 2 Botones:

Imports System.Collections

Public Class Form1
Private dicPrueba As New Dictionary(Of String, Integer)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Randomize()
dicPrueba.Clear()
For i As Integer = 1 To 10
dicPrueba.Add("K" & i, CInt(Rnd() * 10) + 1)
Next
Call ListBox_Cargar()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
Try
For Each o As KeyValuePair(Of String, Integer) In dicPrueba
If o.Value > 6 Then dicPrueba.Add("K" & CStr(dicPrueba.Count + 1),
o.Value * 1000)
Next
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Call ListBox_Cargar()
End Sub
Private Sub ListBox_Cargar()
Me.ListBox1.Items.Clear()
For Each o As KeyValuePair(Of String, Integer) In dicPrueba
Me.ListBox1.Items.Add(o.Value)
Next
End Sub
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As
System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
dicPrueba.Clear()
dicPrueba = Nothing
End Sub
End Class

Saludos

"L. Garcia" <liuxis_siaz***redestb.es> escribió en el mensaje
news:OujZLcycIHA.1204***TK2MSFTNGP03.phx.gbl...
> Hola de nuevo:
>
> Estudiando que objeto utilizar para simular el collection de VB6, me
> encontre con varias opciones y me quede con el objeto Dictionary(Of

String,
> Object), puesto que me permitia indicar el elemento por una clave tipo
> string y a la vez el valor es del tipo que yo quiero, evitando los

problemas
> de definirlo como Object.
>
> Hasta aqui todo bien hasta que me he puesto a jugar con un problema que
> tengo, y no puedo solucionarlo, el problema es muy sencillo:
>
> Lleno un diccionario con Objetos, luego recorro los objetos existentes, y
> dependiendo de los valores de los existentes, puedo añadir mas objetos al
> mismo diccionario.
>
> Para recorrer el Diccionario, utilizo un bucle For Each, pero al añadir un
> objeto al diccionario dentro del For Each, me salta el siguiente error:
>
> "Colección Modificada"
>
> Pero si intento recorrer el Diccionario basandome en el numero de

elementos
> y su indice, pues no puedo !!!
>
> ¿ Existe alguna otra System.Collection que permita el acceso tanto por

'Key'
> como por Posicion a la collecion ?
>
> ¿ Alguna recomendacion en vez de usar Dictionary ?
>
> Saludos y gracias por leer hasta aquí
>
>
>
>
>
>



Responder Con Cita
  #3 (permalink)  
Antiguo 19-02-2008, 23:39:28
SoftJaén
 
Mensajes: n/a
Predeterminado Re: Dictionary, ArrayList ó ...

"L. Garcia" escribió:

> Lleno un diccionario con Objetos, luego recorro los objetos existentes, y
> dependiendo de los valores de los existentes, puedo añadir mas objetos al
> mismo diccionario.
>
> Para recorrer el Diccionario, utilizo un bucle For Each, pero al añadir un
> objeto al diccionario dentro del For Each, me salta el siguiente error:
>
> "Colección Modificada"


Hola, Luis:

Entiendo que esa excepción la obtienes por añadir un nuevo elemento al
diccionario dentro de un bucle «For Each», de hecho, si recorres el código
paso a paso con la tecla de función F8, observarás que el elemento se añade
y se produce la excepción al pasar al siguiente elemento (cuando se ejecuta
«Next»), de ahí que te indique que la colección ha sido modificada porque el
bucle no sabe muy bien lo que tiene que hacer.

Prueba añadir nuevos elementos de la siguiente manera:

For n As Int32 = 1 To dicPrueba.Count

Dim o As Int32 = dicPrueba("K" & CStr(n))

If o > 6 Then
dicPrueba.Add("K" & CStr(dicPrueba.Count + 1), o * 1000)
End If

Next

Call ListBox_Cargar()

Un saludo

--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.

Responder Con Cita
  #4 (permalink)  
Antiguo 20-02-2008, 08:21:34
L. Garcia
 
Mensajes: n/a
Predeterminado Re: Dictionary, ArrayList ó ...

Hola Enrique:

Primero, gracias por responder, y si, es correcto, el error se produce al
añadir un nuevo elemento en la coleccion dentro del For Each, que es lo que
necesito hacer.

Respecto a tu propuesta, el problema es que la clave que puse en el ejemplo,
es eso, un ejemplo, pero mal puesto y eso causa confusion.

En mi caso real la clave 'no depende' de la posicion dentro del Dictionary,
con lo que acceder con un bucle " 1 To .Count " no me es posible, puesto que
no puedo componer la clave partiendo el indice, ni tampoco existe la
posibilidad de acceder por .Item(Integer).

Por eso preguntaba si existe alguna otra Collection que me sirviera para
eso, para acceder tanto por Key Tipo String como por Posicion dentro de la
coleccion.

Saludos


"SoftJaén" <grupo_noticias***softjaen.es> escribió en...
> "L. Garcia" escribió:
>
> > Lleno un diccionario con Objetos, luego recorro los objetos existentes,

y
> > dependiendo de los valores de los existentes, puedo añadir mas objetos

al
> > mismo diccionario.
> >
> > Para recorrer el Diccionario, utilizo un bucle For Each, pero al añadir

un
> > objeto al diccionario dentro del For Each, me salta el siguiente error:
> >
> > "Colección Modificada"

>
> Hola, Luis:
>
> Entiendo que esa excepción la obtienes por añadir un nuevo elemento al
> diccionario dentro de un bucle «For Each», de hecho, si recorres el código
> paso a paso con la tecla de función F8, observarás que el elemento se

añade
> y se produce la excepción al pasar al siguiente elemento (cuando se

ejecuta
> «Next»), de ahí que te indique que la colección ha sido modificada porque

el
> bucle no sabe muy bien lo que tiene que hacer.
>
> Prueba añadir nuevos elementos de la siguiente manera:
>
> For n As Int32 = 1 To dicPrueba.Count
>
> Dim o As Int32 = dicPrueba("K" & CStr(n))
>
> If o > 6 Then
> dicPrueba.Add("K" & CStr(dicPrueba.Count + 1), o * 1000)
> End If
>
> Next
>
> Call ListBox_Cargar()
>
> Un saludo
>
> --
> Enrique Martínez
> [MS MVP - VB]
>
> Nota informativa: La información contenida en este mensaje, así como el
> código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
> garantías de ninguna clase, y no otorga derecho alguno. Usted asume
> cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado

o
> sugerido en el presente mensaje.
>



Responder Con Cita
  #5 (permalink)  
Antiguo 20-02-2008, 09:59:44
Giggs
 
Mensajes: n/a
Predeterminado Re: Dictionary, ArrayList ó ...

No conozco una colección como la que comentas. Sin embargo, yo he
utilizado a veces una solución chapucera que con pocos objetos.
Solamente hay que empezar el bucle desde el principio después de haber
insertado el nuevo objeto.

Si no te parece "elegante", otra cosa que se me ocurre es que las
inserciones las hagas en una colección o diccionario auxiliar y cuando
el bucle acabe hacer las inserciones pertinentes.

Saludos

L. Garcia escribió:
> Hola Enrique:
>
> Primero, gracias por responder, y si, es correcto, el error se produce al
> añadir un nuevo elemento en la coleccion dentro del For Each, que es lo que
> necesito hacer.
>
> Respecto a tu propuesta, el problema es que la clave que puse en el ejemplo,
> es eso, un ejemplo, pero mal puesto y eso causa confusion.
>
> En mi caso real la clave 'no depende' de la posicion dentro del Dictionary,
> con lo que acceder con un bucle " 1 To .Count " no me es posible, puesto que
> no puedo componer la clave partiendo el indice, ni tampoco existe la
> posibilidad de acceder por .Item(Integer).
>
> Por eso preguntaba si existe alguna otra Collection que me sirviera para
> eso, para acceder tanto por Key Tipo String como por Posicion dentro de la
> coleccion.
>
> Saludos
>
>
> "SoftJaén" <grupo_noticias***softjaen.es> escribió en...
>> "L. Garcia" escribió:
>>
>>> Lleno un diccionario con Objetos, luego recorro los objetos existentes,

> y
>>> dependiendo de los valores de los existentes, puedo añadir mas objetos

> al
>>> mismo diccionario.
>>>
>>> Para recorrer el Diccionario, utilizo un bucle For Each, pero al añadir

> un
>>> objeto al diccionario dentro del For Each, me salta el siguiente error:
>>>
>>> "Colección Modificada"

>> Hola, Luis:
>>
>> Entiendo que esa excepción la obtienes por añadir un nuevo elemento al
>> diccionario dentro de un bucle «For Each», de hecho, si recorres el código
>> paso a paso con la tecla de función F8, observarás que el elemento se

> añade
>> y se produce la excepción al pasar al siguiente elemento (cuando se

> ejecuta
>> «Next»), de ahí que te indique que la colección ha sido modificada porque

> el
>> bucle no sabe muy bien lo que tiene que hacer.
>>
>> Prueba añadir nuevos elementos de la siguiente manera:
>>
>> For n As Int32 = 1 To dicPrueba.Count
>>
>> Dim o As Int32 = dicPrueba("K" & CStr(n))
>>
>> If o > 6 Then
>> dicPrueba.Add("K" & CStr(dicPrueba.Count + 1), o * 1000)
>> End If
>>
>> Next
>>
>> Call ListBox_Cargar()
>>
>> Un saludo
>>
>> --
>> Enrique Martínez
>> [MS MVP - VB]
>>
>> Nota informativa: La información contenida en este mensaje, así como el
>> código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
>> garantías de ninguna clase, y no otorga derecho alguno. Usted asume
>> cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado

> o
>> sugerido en el presente mensaje.
>>

>
>

Responder Con Cita
  #6 (permalink)  
Antiguo 20-02-2008, 10:52:36
Lluis Franco
 
Mensajes: n/a
Predeterminado Re: Dictionary, ArrayList ó ...

:-)
Hola,

Esta problemática te pasaría igualmente con un collection de VB6.
La solución es usar una 2º colección para insertar los nuevos, y luego
cuando termines los agregas a la 1º.

Saludos,
--

Lluís Franco i Montanyés
[MS-MVP-MCP Visual Basic]
--
NUG: http://andorradotnet.com
Web: http://sps.uyssoft.com
Blog: http://msmvps.com/blogs/lfranco
Geeks: http://geeks.ms/blogs/lfranco
--
(Guía de netiquette de los foros)
http://sps.uyssoft.com/Foros%20online/Netiquette.aspx
FIMARGE, S.A.
Principat d'Andorra
lfranco***ODIO_EL_SPAMfimarge.ad
Tel.: +376 805 100
Fax: +376 824 500
--
Mi Perfil MVP en:
https://mvp.support.microsoft.com/profile/Lluis
--
This posting is provided "AS IS" with no warranties, and confers no rights.
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho.

Responder Con Cita
  #7 (permalink)  
Antiguo 20-02-2008, 11:02:46
L. Garcia
 
Mensajes: n/a
Predeterminado Re: Dictionary, ArrayList ó ...

"Lluis Franco" <msnews***uyssoft.com> escribió en...
> :-)
> Hola,


Hola tocayo:

> Esta problemática te pasaría igualmente con un collection de VB6.


Cierto, pero lo solventaba con un primer 'For' hasta el numero de elementos
existentes (guardado en una variable) , y luego iba añadiendo a la coleccion
sin problema. Ahora no puedo.

> La solución es usar una 2º colección para insertar los nuevos, y luego
> cuando termines los agregas a la 1º.


Algo así tendré que hacer. Aunque tambien estoy pensando (cuando tenga mas
tiempo y ganas) crear una clase coleccion propia, donde tendria internamente
dos colecciones:

1. Coleccion directa por indice: (List of, por ejemplo)
2. Diccionario por clave (of String, Integer), donde segun la clave, me
diera el indice correspondiente en la primera coleccion.

Si se os ocurre algo mejor, aqui estoy atento a lo que sea :-)

Saludos

>
> Saludos,
> --
>
> Lluís Franco i Montanyés
> [MS-MVP-MCP Visual Basic]
> --
> NUG: http://andorradotnet.com
> Web: http://sps.uyssoft.com
> Blog: http://msmvps.com/blogs/lfranco
> Geeks: http://geeks.ms/blogs/lfranco
> --
> (Guía de netiquette de los foros)
> http://sps.uyssoft.com/Foros%20online/Netiquette.aspx
> FIMARGE, S.A.
> Principat d'Andorra
> lfranco***ODIO_EL_SPAMfimarge.ad
> Tel.: +376 805 100
> Fax: +376 824 500
> --
> Mi Perfil MVP en:
> https://mvp.support.microsoft.com/profile/Lluis
> --
> This posting is provided "AS IS" with no warranties, and confers no

rights.
> Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
> derecho.
>



Responder Con Cita
  #8 (permalink)  
Antiguo 20-02-2008, 11:06:40
L. Garcia
 
Mensajes: n/a
Predeterminado Re: Dictionary, ArrayList ó ...

Hola Giggs:

Primero, gracias por tu interes. La verdad, ahora mismo lo estoy solventando
con la coleccion auxiliar que comentais tanto tu como Lluis Franco. Tambien
me estoy planteando hacerlo segun la respuesta que le he hecho a Lluis, a
ver si me decido a hacerlo y lo expongo en el grupo :-)

Saludos

"Giggs" <soyelprofe***gmail.com> escribió en el mensaje
news:euQhUd6cIHA.148***TK2MSFTNGP04.phx.gbl...
> No conozco una colección como la que comentas. Sin embargo, yo he
> utilizado a veces una solución chapucera que con pocos objetos.
> Solamente hay que empezar el bucle desde el principio después de haber
> insertado el nuevo objeto.
>
> Si no te parece "elegante", otra cosa que se me ocurre es que las
> inserciones las hagas en una colección o diccionario auxiliar y cuando
> el bucle acabe hacer las inserciones pertinentes.
>
> Saludos
>
> L. Garcia escribió:
> > Hola Enrique:
> >
> > Primero, gracias por responder, y si, es correcto, el error se produce

al
> > añadir un nuevo elemento en la coleccion dentro del For Each, que es lo

que
> > necesito hacer.
> >
> > Respecto a tu propuesta, el problema es que la clave que puse en el

ejemplo,
> > es eso, un ejemplo, pero mal puesto y eso causa confusion.
> >
> > En mi caso real la clave 'no depende' de la posicion dentro del

Dictionary,
> > con lo que acceder con un bucle " 1 To .Count " no me es posible, puesto

que
> > no puedo componer la clave partiendo el indice, ni tampoco existe la
> > posibilidad de acceder por .Item(Integer).
> >
> > Por eso preguntaba si existe alguna otra Collection que me sirviera para
> > eso, para acceder tanto por Key Tipo String como por Posicion dentro de

la
> > coleccion.
> >
> > Saludos
> >
> >
> > "SoftJaén" <grupo_noticias***softjaen.es> escribió en...
> >> "L. Garcia" escribió:
> >>
> >>> Lleno un diccionario con Objetos, luego recorro los objetos

existentes,
> > y
> >>> dependiendo de los valores de los existentes, puedo añadir mas objetos

> > al
> >>> mismo diccionario.
> >>>
> >>> Para recorrer el Diccionario, utilizo un bucle For Each, pero al

añadir
> > un
> >>> objeto al diccionario dentro del For Each, me salta el siguiente

error:
> >>>
> >>> "Colección Modificada"
> >> Hola, Luis:
> >>
> >> Entiendo que esa excepción la obtienes por añadir un nuevo elemento al
> >> diccionario dentro de un bucle «For Each», de hecho, si recorres el

código
> >> paso a paso con la tecla de función F8, observarás que el elemento se

> > añade
> >> y se produce la excepción al pasar al siguiente elemento (cuando se

> > ejecuta
> >> «Next»), de ahí que te indique que la colección ha sido modificada

porque
> > el
> >> bucle no sabe muy bien lo que tiene que hacer.
> >>
> >> Prueba añadir nuevos elementos de la siguiente manera:
> >>
> >> For n As Int32 = 1 To dicPrueba.Count
> >>
> >> Dim o As Int32 = dicPrueba("K" & CStr(n))
> >>
> >> If o > 6 Then
> >> dicPrueba.Add("K" & CStr(dicPrueba.Count + 1), o * 1000)
> >> End If
> >>
> >> Next
> >>
> >> Call ListBox_Cargar()
> >>
> >> Un saludo
> >>
> >> --
> >> Enrique Martínez
> >> [MS MVP - VB]
> >>
> >> Nota informativa: La información contenida en este mensaje, así como el
> >> código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
> >> garantías de ninguna clase, y no otorga derecho alguno. Usted asume
> >> cualquier riesgo al poner en práctica, utilizar o ejecutar lo

recomendado
> > o
> >> sugerido en el presente mensaje.
> >>

> >
> >



Responder Con Cita
 
Respuesta


Herramientas
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Trackbacks are habilitado
Pingbacks are habilitado
Refbacks are habilitado


Temas Similares
Tema Autor Foro Respuestas Último mensaje
obtener clave Dictionary... AM1978 Newsgroup microsoft.public.es.dotnet.vb 2 26-02-2009 08:29:41
Asignacion de objetos dictionary Alfonso Newsgroup microsoft.public.es.asp 5 07-04-2008 17:39:02
Dictionary h_alvarez21 Newsgroup microsoft.public.es.vb 2 28-03-2008 14:00:01
Ayuda con Dictionary jcac Newsgroup microsoft.public.es.vb 3 14-12-2007 17:59:45
Binding de Dictionary Alhambra Eidos Kiquenet Newsgroup microsoft.public.es.csharp 0 20-11-2007 13:46:08



La franja horaria es GMT. Ahora son las 18:35:03.



Powered by: vBulletin, Versión 3.6.8
Derechos de Autor ©2000 - 2010, Jelsoft Enterprises Ltd.

LinkBacks Enabled by vBSEO 3.1.0 © 2007, Crawlability, Inc.