2009-08-31 20 views
46

tengo una cadena que viene como:recortar todas las cadenas en una matriz

string email = "[email protected], [email protected], [email protected]"; 

quiero dividirlo en una matriz de cadenas

Si hago esto:

string[] emails = email.Split(','); 

Tengo espacios delante de cada dirección de correo electrónico (después del primero):

emails[0] = "[email protected]" 
emails[1] = " [email protected]" 
emails[2] = " [email protected]" 

¿Cuál es la mejor manera de obtener esto (ya sea una mejor manera de analizar o una forma de recortar todas las cadenas en una matriz)?

emails[0] = "[email protected]" 
emails[1] = "[email protected]" 
emails[2] = "[email protected]" 
+2

Si el espacio _siempre_ estará allí, puede agregarlo a la división ... es decir: email.Split (','); – nilamo

Respuesta

24

También puede sustituir todas las apariciones de espacios, y así evitar el bucle foreach:

string email = "[email protected], [email protected], [email protected]";  
string[] emails = email.Replace(" ", "").Split(','); 
+7

-1 (solo porque fue marcado como la * respuesta *). Si bien esto coloca el texto requerido en la matriz, no es el uso más expresivo de la API disponible. –

+9

@ 280Z28: Eso no es motivo para una votación negativa. –

+6

Funciona bien para este ejemplo específico, pero no mantiene espacios para los elementos resultantes como; "foo bar, otro elemento, blah_blah". Bryan Watts tiene la mejor respuesta IMO. – revgum

7

Puede utilizar Trim():

string email = "[email protected], [email protected], [email protected]"; 
string[] emails = email.Split(','); 
emails = (from e in emails 
      select e.Trim()).ToArray(); 
+0

Esta respuesta es correcta pero es exagerada, esta respuesta tiene el mejor enfoque: http://stackoverflow.com/questions/1355704/trim-all-strings-in-an-array/1355732#1355732 –

0

Uso String.Trim en un bucle foreach, o si está utilizando .NET 3.5 + una declaración de LINQ.

0

Alternativamente, puede dividir utilizando una expresión regular de la forma:

\s*,\s* 

es decir

string[] emails = Regex.Split(email, @"\s*,\s*"); 

que consumirá los espacios que rodean directamente.

Las expresiones regulares suelen ser un golpe de rendimiento, pero el ejemplo que dio indica que esto es algo que planea hacer una vez en su código para una matriz corta.

8

Uso Regex.Split para evitar el recorte

var emails = Regex.Split(email, @",\s*"); 
17

Cualquiera de los siguientes funcionaría. Yo recomendaría el primero ya que expresa con mayor precisión la cadena de unión.

string[] emails = email.Split(new string[] { ", " }, StringSplitOptions.None); 
string[] emails = email.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries); 
+0

+1 No sabía acerca de las opciones. Viniendo de Perl, veo expresiones regulares en todas partes. Con las opciones Split es el camino a seguir. –

+1

+1 usamos LINQ tanto que tendemos a olvidar que existen otras opciones elegantes. –

175
emails.Split(',').Select(email => email.Trim()).ToArray() 
+0

¿Qué sucede si no quiere que Linq sea una dependencia? – Moismyname

+2

@Moismyname: no estoy seguro de qué restricción lo llevará por ese camino, pero hay otras respuestas que abordan su pregunta. –

+0

Agradable y limpio. Funcionó perfectamente para mí ¡Gracias! – CrazyPaste

5

Se puede utilizar una solución de una línea como la siguiente:

string[] emails = text.Split(',', StringSplitOptions.RemoveEmptyEntries); 
Array.ForEach<string>(emails, x => emails[Array.IndexOf<string>(emails, x)] = x.Trim()); 
1

La respuesta de Bryan Watts es elegante y simple. Se refiere implícitamente a la matriz de cadenas creadas por Split().

También tenga en cuenta su extensibilidad si está leyendo un archivo, y desea realizar un masaje de los datos mientras construye una matriz.

string sFileA = @"C:\Documents and Settings\FileA.txt"; 
string sFileB = @"C:\Documents and Settings\FileB.txt"; 

// Trim extraneous spaces from the first file's data 
string[] fileAData = (from line in File.ReadAllLines(sFileA) 
         select line.Trim()).ToArray(); 

// Strip a second unneeded column from the second file's data 
string[] fileBData = (from line in File.ReadAllLines(sFileB) 
         select line.Substring(0, 21).Trim()).ToArray(); 

Por supuesto, puede utilizar la notación Linq => si lo prefiere.

string[] fileBData = File.ReadAllLines(sFileB).Select(line => 
          line.Substring(0, 21).Trim()).ToArray(); 

Aunque mi respuesta debería haber sido publicado como un comentario, no tengo suficientes puntos de reputación para comentarios.Pero encontré que esta discusión es invaluable para descubrir cómo administrar datos mientras se usa ReadAllLines().

+0

Llegamos a [SO]. Un pequeño punto en tu código: si estás utilizando Linq de esa manera, es mejor utilizar 'File.ReadLines'. 'ReadAllLines'" sorbe "todo el archivo en una matriz en memoria, lo que obviamente puede ser problemático con archivos grandes. 'ReadLines' solo lee una línea a la vez, lo cual es excelente si no necesita conservar la versión inicial de los contenidos. – RoadieRich

+0

Gracias! Puedo ver que el ejemplo que utiliza ReadAllLines se descompondrá para archivos muy grandes, que contienen los datos brutos y las versiones recortadas en la memoria al mismo tiempo, por un momento. La página de documentación para File.ReadLines() también tiene un ejemplo que encaja con esta discusión. – RonSanderson

Cuestiones relacionadas