![]() |
| |||||||
| Registrarse | Preguntas Frecuentes | Lista de Foreros | Calendario | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
| | LinkBack | Herramientas | Desplegado |
| |||
| 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í |
| | ||||
| ||||
| |
| |||
| 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í > > > > > > |
| |||
| "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. |
| |||
| 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. > |
| |||
| 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. >> > > |
| |||
| :-) 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. |
| |||
| "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. > |
| |||
| 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. > >> > > > > |
| |
| |
![]() |
| Herramientas | |
| Desplegado | |
| |
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 |