lunes, 22 de agosto de 2011

Dividir string e ignorar los vacíos

Vamos a poner el caso que tenemos un string formado por números, como este:
"456 234  123 67 987 890 123  444 768"
split_string
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:

xxxxx dijo...
Este blog ha sido eliminado por un administrador de blog.