2010-02-24 19 views
10

Ho spesso bisogno di convertire un "blocco di stringa" (una stringa contenente caratteri di ritorno, ad esempio da un file o un TextBox) in List<string>.Qual è il modo migliore per convertire una stringa separata da caratteri di ritorno in un elenco <string>?

Qual è un modo più elegante di farlo rispetto al metodo ConvertBlockToLines riportato di seguito?

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; 
     } 

    } 
} 

risposta

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

Ciò manterrà a capo consecutivi come stringhe vuote (vedi StringSplitOptions)

+1

Non è necessario passare 'StrringSplitOptions.None' perché questo è il comportamento predefinito di Split(). –

+3

@Seth: ti sbagli, devi passarlo, quando mandi una 'stringa []', (e non un 'char []').In questo caso, forse non è ovvio per te che Environment.NewLine sia una 'stringa []'. Quindi il tuo commento aiuta a sottolineare che è bello essere prolisso :) –

+0

@silky: Mio male, hai ragione. Questo è quello che ottengo per commentare in fretta ... –

3

Hai provato scissione sul ritorno a capo/capo e utilizzando l'estensione IEnumerable ToList?

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

Se si desidera mantenere le linee vuote, ma potrebbe avere sia il ritorno a capo che il ritorno a capo.

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

ho potuto, ma nella maggior parte dei casi ho bisogno di mantenere tutti i * veri * righe vuote che possono essere nel blocco di stringa. Per come la capisco, il tuo suggerimento eliminerebbe anche questi. –

+0

Ho aggiornato per riflettere il problema. – tvanfosson

+0

@tvanfosson: Non sembra che tu abbia :) –

0

LINQ!

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

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

Hmm. Sai che string ha ora uno .Split() che accetta un array string[], giusto?

Quindi ...

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

E questo entra nella lista come? – DOK

+0

@DOK: Dovresti essere cieco freddy per non vedere come farlo. Indipendentemente da ciò, sebbene l'OP abbia intitolato la domanda in questo modo, con un'attenta revisione della domanda, noterete che non era il suo vero problema. –

2

ou può utilizzare RegEx.Split di dividere direttamente utilizzando l'Enviroment.NewLine.

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

Sembra un abuso di Regex.Split() per me. Perché dovresti sostenere l'overhead dell'analisi e dell'abbinamento regex quando non stai utilizzando una regex? String.Split() è una soluzione migliore qui. –

4

Non c'è bisogno di convertire il vostro segno speciale:

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