none
El Array me lo muestra desordenado RRS feed

  • Pregunta

  • Buenas amigos, me podrian ayudar.

    Estoy guardando las imagenes de una ruta en un array pero el problema que tengo es que me lo muestra desordenado 

    me lo muestra asi. (mirar la imagen).
    y necesito que me lo muestre ordenado asi 
    C\\....\\Imagen1.jpg"

    C\\....\\Imagen2.jpg"

    C\\....\\Imagen3.jpg"

    C\\....\\Imagen4.jpg"

    C\\....\\Imagen5.jpg"



    MUCHAS GRACIAS

    martes, 10 de abril de 2018 17:21

Respuestas

  • hola

    podrias aplicar un order de linq, o sea

    count_imagenes = count_imagenes.OrderBy(x=>x).ToArray();

    usando las extensiones de linq quizas lo ordene correctamente

    Enumerable.OrderBy()

    igualmente hay un tema, si querias ordenar cadenas como numeros las imagenes deberia llamarse

    imagen01.jpg

    imagen02.jpg

    imagen10.jpg

    al posicionar los valores numericos seguro aplique correctamente, si sabes que seran dos numero usarias 00, si son 3 entonces usarias 000, como sera 001, 002, 010, etc

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina



    • Editado Leandro TuttiniMVP martes, 10 de abril de 2018 19:39
    • Marcado como respuesta TysonWB martes, 10 de abril de 2018 21:15
    martes, 10 de abril de 2018 19:37

Todas las respuestas

  • En realidad está perfectamente bien ordenado.  El 1 va antes del 2, etc.  Si se fija bien, el orden alfabético está 100% correcto.

    Si quiere ordenar solamente los números, deberá proveer su propio comparador.

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text.RegularExpressions;
     
    public class Test
    {
    	public class CompNombresDeArchivo : IComparer<string>
    	{
    		private Regex MiRegex { get; set; }
    		private IComparer<string> DefComparer { get; set; }
     
    		public CompNombresDeArchivo()
    		{
    			MiRegex = new Regex(@"\d+");
    			DefComparer = Comparer<string>.Default;
    		}
    		public int Compare(string op1, string op2)
    		{
    			Match m1 = MiRegex.Matches(Path.GetFileNameWithoutExtension(op1)).OfType<Match>().LastOrDefault();
    			Match m2 = MiRegex.Matches(Path.GetFileNameWithoutExtension(op2)).OfType<Match>().LastOrDefault();
    			if (m1 == null && m2 == null)
    			{
    				return 0;
    			}
    			if (m1 == null)
    			{
    				//No podemos comparar numéricamente.  Comparamos entonces alfabéticamente.
    				return DefComparer.Compare(op1, op2);
    			}
    			if (m2 == null)
    			{
    				//No podemos comparar numéricamente.  Comparamos entonces alfabéticamente.
    				return DefComparer.Compare(op1, op2);
    			}
    			int valor1, valor2;
    			if (!Int32.TryParse(m1.Value, out valor1))
    			{
    				//Imposible continuar.  Arrojar excepción (alternativamente comparar como texto).
    				throw new ArgumentException($"El nombre de archivo {op1} parece contener un número, pero fue imposible convertirlo.");
    			}
    			if (!Int32.TryParse(m2.Value, out valor2))
    			{
    				//Imposible continuar.  Arrojar excepción (alternativamente comparar como texto).
    				throw new ArgumentException($"El nombre de archivo {op2} parece contener un número, pero fue imposible convertirlo.");
    			}
    			return valor1.CompareTo(valor2);
    		}
    	}
    	private static void MostrarArreglo(string[] datos)
    	{
    		foreach (string s in datos)
    		{
    			Console.WriteLine(s);
    		}
    	}
    	public static void Main()
    	{
    		string [] datos = new string[]
    		{
    			"imagen1",
    			"imagen10",
    			"imagen11",
    			"imagen2",
    			"imagen3",
    			"imagen31",
    			"imagen17",
    			"imagen26",
    			"imagen9",
    			"imagen8",
    			"imagen85",
    			"imagen23",
    		};
    		Console.WriteLine("Datos desordenados:");
    		MostrarArreglo(datos);
    		Array.Sort(datos, new CompNombresDeArchivo());
    		Console.WriteLine();
    		Console.WriteLine("Datos ordenados:");
    		MostrarArreglo(datos);
    	}
    }

    Ese programa de ejemplo lo puede ver en vivo aquí.


    Jose R. MCP
    Code Samples

    martes, 10 de abril de 2018 18:20
    Moderador
  • hola

    podrias aplicar un order de linq, o sea

    count_imagenes = count_imagenes.OrderBy(x=>x).ToArray();

    usando las extensiones de linq quizas lo ordene correctamente

    Enumerable.OrderBy()

    igualmente hay un tema, si querias ordenar cadenas como numeros las imagenes deberia llamarse

    imagen01.jpg

    imagen02.jpg

    imagen10.jpg

    al posicionar los valores numericos seguro aplique correctamente, si sabes que seran dos numero usarias 00, si son 3 entonces usarias 000, como sera 001, 002, 010, etc

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina



    • Editado Leandro TuttiniMVP martes, 10 de abril de 2018 19:39
    • Marcado como respuesta TysonWB martes, 10 de abril de 2018 21:15
    martes, 10 de abril de 2018 19:37
  • Muchas gracias por la ayuda me sirvio, gracias!
    martes, 10 de abril de 2018 21:15
  • Muchas gracias por la asesoria esta super claro y me ayudo mucho. muchas gracias
    martes, 10 de abril de 2018 21:16