none
Omitir elementos repetidos obtenidos desde un XML RRS feed

  • Pregunta

  • Hola que tal estoy obteniendo datos de un XML con la siguiente estructura

    <title>Hermosillo Franquicias</title>
    <numero>174</numero>
    <colonia>Col. Raquet Club</colonia>
    <atm>0</atm>
    <kiosco>1</kiosco>
    <horario>
    Lunes a Viernes 9:00 a 19:00 hrs. Sábado y Domingo 9:00 a 18:00 hrs.
    </horario>
    <municipio>Hermosillo</municipio>
    <calle>Periférico Poniente y Blvd. Colosio</calle>
    <referencias>Loc. 4. Plaza Franquicias</referencias>
    <estado>Sonora</estado>
    <codigo_postal>83200</codigo_postal>
    <latitud>29.086465</latitud>
    <longitud>-110.986368</longitud>
    </item>
    <item>
    <title>Guaymas</title>
    <numero>847</numero>
    <colonia>Col. Guadalupe</colonia>
    <atm>0</atm>
    <kiosco>0</kiosco>
    <horario>...</horario>
    <municipio>Guaymas</municipio>
    <calle>Calzada Agustín García López</calle>
    <referencias>Int. 1</referencias>
    <estado>Sonora</estado>
    <codigo_postal>85440</codigo_postal>
    <latitud>27.924889</latitud>
    <longitud>-110.911084</longitud>

    </item>

    como podran observar tengo repetido el campo estado y quiero que en mi listbox ese campo solo aparesca 1 vez así tengo los 32 estados de la republica mexicana que aparecen en multiples ocasiones como puedo hacer para que solo aparescan 1 vez en mi listbox si se repiten mas ocaciones estoy usando este codigo para parsear el XML

    XDocument xmlCategories = XDocument.Parse(file.obtener_file());

                    estados.ItemsSource = from lista in xmlCategories.Descendants("item")
                                          select new Item
                                          {

                                              title = lista.Element("title").Value,
                                              numero = lista.Element("numero").Value,
                                              colonia = lista.Element("colonia").Value,
                                              atm = lista.Element("atm").Value,
                                              kiosko = lista.Element("kiosko").Value,
                                              horario = lista.Element("horario").Value,
                                              municipio = lista.Element("municipio").Value,
                                              calle = lista.Element("calle").Value,
                                              referencias = lista.Element("referencias").Value,
                                              estado = lista.Element("estado").Value,
                                              codigoPostal = lista.Element("codigo_postal").Value,
                                              latitud = Convert.ToDouble(lista.Element("latitud").Value),
                                              longitud = Convert.ToDouble(lista.Element("longitud").Value)

                                          };

    saludos y gracias

    miércoles, 27 de junio de 2012 22:17

Todas las respuestas

  • Pienso que lo más saludable sería crear un diccionario o colección indizada que rechace elementos repetidos.  No programo Windows Phone 7 pero yo diría que el problema es suficientemente genérico y por lo tanto creo que la solución sería multiplataforma.

    Primero que nada le aclaro que nunca me he dedicado a aprender Linq, así que tal vez haya una forma sencilla en Linq pero no la conozco.

    En .Net para Windows existe la colección System.Collections.ObjectModel.KeyedCollection<K, T>.  Según la documentación de Silverlight, esta colección no admite claves repetidas, así que sería una buena selección.  Sería cuestión de extraer los elementos del XML, convertirlos a objetos y almacenarlos en una colección de este tipo.  Cualquier objeto agregado a la lista cuya clave ya esté en lista será rechazado.  El resultado final será una colección con elementos únicos (según la selección de la clave).

    Alternativamente y si no es muchísimos datos, cree un List<string>.  Llénelo con los estados, pero antes utilice List<string>.Contains() para ver si ya existe.  No agregue un estado si Contains() dice que ya está en lista.  La función Contains() trabaja buscando secuencialmente en la lista desde el primer item hasta el último, así que su desempeño será muy pobre si la lista contiene muchísimos items.


    Jose R. MCP
    Code Samples

    jueves, 28 de junio de 2012 0:50