2010-02-24 14 views
10

Necesito a menudo convertir un "bloque de cadena" (una cadena que contiene caracteres de retorno, por ejemplo, desde un archivo o un TextBox) en List<string>.¿Cuál es la mejor forma de convertir una cadena separada por caracteres de retorno en una lista <string>?

¿Cuál es una forma más elegante de hacerlo que el método ConvertBlockToLines a continuación?

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace TestConvert9922 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string testBlock = "line one" + Environment.NewLine + 
       "line two" + Environment.NewLine + 
       "line three" + Environment.NewLine + 
       "line four" + Environment.NewLine + 
       "line five"; 

      List<string> lines = StringHelpers.ConvertBlockToLines(testBlock); 

      lines.ForEach(l => Console.WriteLine(l)); 
      Console.ReadLine(); 
     } 
    } 

    public static class StringHelpers 
    { 
     public static List<string> ConvertBlockToLines(this string block) 
     { 
      string fixedBlock = block.Replace(Environment.NewLine, "§"); 
      List<string> lines = fixedBlock.Split('§').ToList<string>(); 
      lines.ForEach(s => s = s.Trim()); 
      return lines; 
     } 

    } 
} 

Respuesta

20
List<string> newStr = str.Split(new[] { Environment.NewLine }, StringSplitOptions.None).ToList(); 

Esto evitará que las nuevas líneas consecutivas como cadenas vacías (ver StringSplitOptions)

+1

No es necesario pasar 'StrringSplitOptions.None' porque ese es el comportamiento predeterminado de Split(). –

+3

@Seth: Estás equivocado, debes pasarlo, cuando envías un 'string []', (y no un 'char []').En este caso, posiblemente no sea obvio para usted que Environment.NewLine es una 'cadena []'. Entonces, tu comentario ayuda a resaltar que es bueno ser prolijo :) –

+0

@silky: Mi mal, tienes razón. Eso es lo que recibo por comentar de prisa ... –

3

Ha intentado dividir a la entrega de nueva línea/carro y el uso de la extensión IEnumerable ToList?

testBlock.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries) 
     .ToList() 

Si desea mantener las líneas vacías, puede tener tanto avance de línea como retorno de carro.

textBlock.Replace("\r\n", "\n").Replace("\r", "\n").Split('\n').ToList(); 
+0

que pude, pero en la mayoría de los casos que necesitan para mantener cualquier línea vacía * * reales que pueden estar en el bloque de cadena. De la manera en que lo entiendo, tu sugerencia eliminaría estos también. –

+0

He actualizado para reflejar su problema. – tvanfosson

+0

@tvanfosson: No parece que tengas :) –

0

LINQ!

var linesEnum = testBlock.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).AsEnumerable(); 

List<string> lines = linesEnum.ToList(); 
2

Hmm. ¿Sabe que string ahora tiene un .Split() que toma una matriz de string[], ¿verdad?

Entonces ...

string[] lines = data.Split(
    new string[1]{ Environment.NewLine }, 
    StringSplitOptions.None 
); 
+0

Y esto se mete en la lista ¿cómo? – DOK

+0

@DOK: Tendría que ser ciego freddy para no ver cómo hacerlo. De todos modos, aunque el OP ha titulado la pregunta de esa manera, con una revisión cuidadosa de la pregunta, notará que ese no era su problema real. –

2

ou puede utilizar para dividir RegEx.Split directamente utilizando el Enviroment.NewLine.

public static List<string> ConvertBlockToLines(this string block) 
{ 
    return Regex.Split(block, Environment.NewLine).ToList(); 
} 
+1

Esto parece un abuso de Regex.Split() para mí. ¿Por qué querría incurrir en la sobrecarga de análisis y correlación de expresiones regulares cuando no está utilizando realmente una expresión regular? String.Split() es una mejor solución aquí. –

4

No hay necesidad de convertir a su signo especial:

List<string> strings = str.Split(new string[] {Environment.NewLine}, StringSplitOptions.None).ToList(); 
strings.ForEach(s => s = s.Trim()); 
Cuestiones relacionadas