2010-02-24 108 views
10

我需要經常轉換「串塊」(一個包含字符串的字符返回,例如從文件或一個文本框)List<string>什麼是將返回字符分隔的字符串轉換爲列表的最佳方式<string>?

什麼是比以下ConvertBlockToLines方法更優雅的方式嗎?

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

    } 
} 

回答

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

這將保持連續的換行符空字符串(見StringSplitOptions

+1

您不需要傳遞'StrringSplitOptions.None',因爲這是Split()的默認行爲。 – 2010-02-24 13:38:26

+3

@Seth:你錯了,在發送'string []'(而不是'char []')時必須通過它。在這種情況下,你可能並不清楚Environment.NewLine是一個'string []'。所以你的評論有助於強調它是好的是冗長:) – 2010-02-24 13:44:59

+0

@silky:我的壞,你說得對。這就是我匆匆發表評論的原因... – 2010-02-24 13:55:40

3

你有沒有嘗試過換行/回車分裂,並使用了IEnumerable ToList擴展?

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

如果您想保留空行但可能同時有換行符和回車符。

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

我可以,但在大多數情況下,我需要保持任何* *真正的空行,可能是在串塊。我理解它的方式,你的建議也會刪除它們。 – 2010-02-24 13:23:51

+0

我已更新以反映您的問題。 – tvanfosson 2010-02-24 13:25:04

+0

@tvanfosson:它似乎沒有你:) – 2010-02-24 13:28:17

0

LINQ!

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

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

嗯。你知道string現在有一個.Split(),它需要一個string[]數組,對吧?

所以......

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

而這進入列表如何? – DOK 2010-02-24 13:40:35

+0

@DOK:如果你不明白怎麼做,那你必須要盲目投入。無論如何,雖然OP以這種方式標題了這個問題,但仔細回顧這個問題,你會注意到這不是他真正的問題。 – 2010-02-24 13:42:21

2

您可以同時使用RegEx.Split直接使用Enviroment.NewLine分裂。

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

這看起來像是對我的濫用Regex.Split()。爲什麼你會想要在實際上沒有使用正則表達式時產生正則表達式解析和匹配的開銷? String.Split()在這裏是一個更好的解決方案。 – 2010-02-24 13:40:17

4

無需轉換到你的特殊記號:

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