• Lunes 29 de Abril de 2024, 23:39

Autor Tema:  Ordenar listas - help  (Leído 1533 veces)

Yakuza

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Ordenar listas - help
« en: Sábado 7 de Mayo de 2011, 05:52 »
0
Resulta que tengo unas listas, las cuales las fui creando juntas, es decir el index de la lista q guarde el primer valor, lo use para poner otro valor en la otra lista con ese mismo index.
Perdonen que no me pueda explicar bien :/ , miren algo asi hice:

for (i = 0; i < num; i++)
list = "2"
list2 = "-8x"

Es decir, van en pareja juntitos esos valores.

El problema es este:
El list[] tiene valores string del "1" hasta lo q sea, pero siempre algo como esto "1", "5", "6" , "7", "2", "3", "4".
El list2[] tiene valores string de por ejemplo "2x" o "+7" o "-4" , etc.
Un ejemplo de valores despues del bucle donde tomo esos valores podria ser asi:

list[0] = "1"
list2[0] = "2x"

list[1] = "5"
list2[1] = "+7"

list[2] = "6"
list2[2] = "-4"

list[3] = "2"
list2[3] = "-8x"

Ahora lo que yo quiero es ordenar el list[] con su valor maximo primero hasta el valor minimo que sera 1. Es decir, cambiarle los index para que el valor de list[0] = "6" , list[1] = "5" , list[2] = "2" , list[3] = "1"
PERO.. acuerdense que cada valor iba junto a la otra lista, la list2[], entonces habria que cambiar el list2[] para que quede list2[0] = "-4" , list2[1] = "+7", list2[2] = "-8x", list2[3] = "2x"

Entienden? si no entienden tratare de explicar de nuevo, talvez la enrede mucho y no es algo muy dificil de hacer, pero no puedo ni empezar, solo me plantie hacerlo asi:


Código: C#
  1. public static void Order(ref List<string> lMulti, ref List<string> lNivel)
  2.         {
  3.             List<string> lM = new List<string>();
  4.             List<string> lN = new List<string>();
  5.  
  6.  
  7.  
  8.  
  9.         }
  10.  


Ya que esas listas vienen como referencia para "transformarse"
La lista lMulti es la list2[] del ejemplo y la lista lNivel es la list[].
Esas 2 listas dentro del procedimiento lo puse porque talvez una idea es ir metiendo los datos en esos 2 para luego al final pasarle los valores a las listas.

Espero que puedan ayudarme, desde ya gracias!

alexg88

  • Miembro activo
  • **
  • Mensajes: 37
    • Ver Perfil
Re: Ordenar listas - help
« Respuesta #1 en: Sábado 7 de Mayo de 2011, 15:59 »
0
Esto es lo único que se me ha ocurrido:

Código: C#
  1.  
  2. public static int comparar(string[] x, string[] y)
  3.         {
  4.             int num1, num2;
  5.  
  6.             num1 = Convert.ToInt32(x[0]);
  7.             num2 = Convert.ToInt32(y[0]);
  8.  
  9.             if (num1 > num2)
  10.                 return 1;
  11.             else
  12.                 if (num1 < num2)
  13.                     return -1;
  14.                 else return 0;
  15.          
  16.         }
  17.  
  18. public static void Order(ref List<string> lMulti, ref List<string> lNivel)
  19.         {
  20.             List<string[]> listacomb = new List<string[]>(lMulti.Count);
  21.  
  22.             for(int i=0;i<listacomb.Capacity;i++)
  23.             {
  24.                 listacomb.Add(new string[] { lMulti[i], lNivel[i] });
  25.             }
  26.  
  27.             listacomb.Sort(comparar);
  28.  
  29.             for (int i = 0; i < listacomb.Count; i++)
  30.             {
  31.                 lMulti[i] = listacomb[i][0];
  32.                 lNivel[i] = listacomb[i][1];
  33.             }
  34.         }
  35.  
  36.  

Primero creas una lista de arrays de string y los ordenas con un comparador personalizado (la función comparar). Luego vuelves a dividir la lista y ya está.

Habrá más formas y quizás esta no es la más eficiente pero bueno.

Yakuza

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Ordenar listas - help
« Respuesta #2 en: Sábado 7 de Mayo de 2011, 19:09 »
0
Me dice que no se pudo comparar la matriz algo asi, esque no se si te falto ponerle los parametros al metodo comparar, cuando pones: listacomb.Sort(comparar);
Y no se q ponerle, gracias igual en serio!

alexg88

  • Miembro activo
  • **
  • Mensajes: 37
    • Ver Perfil
Re: Ordenar listas - help
« Respuesta #3 en: Sábado 7 de Mayo de 2011, 22:02 »
0
comparar es una función especial (llamada delegado) que se le pasa al método Sort para realizar un ordenación personalizada. La función en este caso
es la que te pongo primera. No se que problema te da, a mi me va perfecto tal cual está.

Te paso una mejora en la que se le añade al método Order la función de comparación, para que no haya efectos laterales (el pasar el método comparar dentro del método Order no es buena programación, es mejor pasarle como parámetro el método).

Código: C#
  1.  
  2. using System;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Collections.Generic;
  6.  
  7. namespace PruebasCSharp
  8. {
  9.  
  10.  
  11.     class Program
  12.     {
  13.  
  14.          
  15.         public static int comparar(string[] x, string[] y)
  16.         {
  17.             int num1, num2;
  18.  
  19.             num1 = Convert.ToInt32(x[0]);
  20.             num2 = Convert.ToInt32(y[0]);
  21.  
  22.             if (num1 > num2)
  23.                 return 1;
  24.             else
  25.                 if (num1 < num2)
  26.                     return -1;
  27.                 else return 0;
  28.          
  29.         }
  30.  
  31.         public static void Order(ref List<string> lMulti, ref List<string> lNivel, Comparison<string[]> comparar)
  32.         {
  33.             List<string[]> listacomb = new List<string[]>(lMulti.Count);
  34.  
  35.             for(int i=0;i<listacomb.Capacity;i++)
  36.             {
  37.                 listacomb.Add(new string[] { lMulti[i], lNivel[i] });
  38.             }
  39.  
  40.             listacomb.Sort(comparar);
  41.  
  42.             for (int i = 0; i < listacomb.Count; i++)
  43.             {
  44.                 lMulti[i] = listacomb[i][0];
  45.                 lNivel[i] = listacomb[i][1];
  46.             }
  47.         }
  48.        
  49.         static void Main(string[] args)
  50.         {
  51.            
  52.             List<string> lMulti = new List<string>(new String[] {"2","1","3"});
  53.             List<string> lNivel = new List<string>(new String[] {"2x","1x","3x"});
  54.  
  55.             Order(ref lMulti, ref lNivel,comparar);
  56.            
  57.  
  58.         }
  59.     }
  60. }
  61.  
  62.  
  63.  
  64.  

Yakuza

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Ordenar listas - help
« Respuesta #4 en: Domingo 8 de Mayo de 2011, 00:01 »
0
Ah, no habia copiado bien, no sabia que habias cambiado de parametros jaja , gracias !

alexg88

  • Miembro activo
  • **
  • Mensajes: 37
    • Ver Perfil
Re: Ordenar listas - help
« Respuesta #5 en: Domingo 8 de Mayo de 2011, 00:03 »
0
He cambiado de parámetros en la segunda versión, en la primera está igual que el tuyo pero es más correcta la segunda.