2010-02-24 65 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()); 
相关问题