"456 234 123 67 987 890 123 444 768"
Analizen este string y dense cuenta que a propósito he dejado más de un espacio a veces entre valores.
Ahora, lo que queremos es dividir el string y obtener los números, luego de eso lo queremos ordenar ascendente o descendente.
Veamos el código:
string n = "456 234 123 67 987 890 123 444 768"; string[] split = n.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries); List<int> Numbers = new List<int>(); for (int i = 0; i < split.Length; i++) { Numbers.Add(Convert.ToInt32(split[i])); } Numbers.Sort(); //si quieres en orden descendente... descomenta la sgte línea //Numbers.Reverse();Como pueden ver, hago un split, usando además el parámetro StringSplitOptions.RemoveEmptyEntries, el cual me permite ignorar aquellos valores vacíos que pudiera hallar al hacer el split de la cadena.
Luego de eso, a través de una sentencia FOR, voy enviando cada valor que recupero del string hacia una lista genérica de números enteros, lo cual me va a dar la facilidad de manipularlos u ordenarlos, como pudieron ver en las líneas de arriba.
Numbert.Sort(), por defecto me ordena Ascendente y Numbers.Reverse() me permite invertir el orden para que quede descendente.
Ahora vamos a hacer lo mismo, pero esta vez usaremos Linq:
string n = "456 234 123 67 987 890 123 444 768"; //1.- obtengo los valores en un array de strings string[] source = n.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries); //2.- paso el array de string hacia un array de números enteros int[] Numbers = Array.ConvertAll<string, int>(source, delegate(string s) { return int.Parse(s); }); //3.- con Linq, paso el array de números enteros hacia una collection de enteros...
//y aquí mismo los ordeno List<int> MyCollection = (from val in Numbers.AsEnumerable() orderby val //descending select val ).ToList<int>(); //ahora puedes recorrer los elementos de la colección foreach (var number in MyCollection) Console.WriteLine(number);Vamos a hacer los mismo, otra vez, pero esta vez usaremos expresiones regulares:
string n = "456 234 123 67 987 890 123 444 768"; var numbers = System.Text.RegularExpressions.Regex.Split(n, @"\s+").OrderBy(x => int.Parse(x)); foreach (var number in numbers) Console.WriteLine(number);Francamente, esta situación la hubiera resuelto haciendo Split de la cadena o usando Linq… pero alguien me recordó el poder de las Expresiones regulares combinado con Linq… y francamente ha quedado muy bien.
Ahí les dejo entonces, uds elijan cómo lo hacen.
Espero que les sea de utilidad ;)
1 comentario:
Publicar un comentario