如何将带有“\r\n”的字符串转换为列表?

How to convert string with some "\r\n" into list?

我有一个字符串,想将其转换为 LinkedList,这样每一行都是一个元素。

我用的是Visual Studio2012.

有什么简单的方法吗?

这个字符串看起来像:

LOAD  =5.01E+10
MPY   
ADD   

但实际上它包含LOAD =5.01E+10\r\nMPY \r\nADD

重要更新:我不需要删除“\r\n”或类似的内容。我需要在每个元素中包含一对 "left part" 和 "right part" 的列表(实际上没有链接)。我从前面的例子中得到什么样的列表的例子:

("LOAD  ", "=5.01E+10") => ("MPY   ", "") => ("ADD   ", "") => null

实际上,最好在剩下的部分之后免费保存所有这些 space。

是的,

 yourString = yourString.Replace(System.Environment.NewLine, "\r\n");

http://www.dotnetperls.com/newline

这是输出

string LOAD = "5.01E+10\r\nMPY \r\nADD ";
string newstring1 = LOAD.Replace("\r", " ");
string newstring2 = newstring1.Replace("\n", " ");
Console.WriteLine(newstring2);

输出

5.01E+10 MPY  ADD 

换行符的表示方式取决于环境:Linux 例如使用 \n.

为了简化操作,您可以使用 StringReader:

public static IEnumerable<string> Lines (string text) { 
    string line;
    using (StringReader reader = new StringReader(text)) {
        while ((line = reader.ReadLine()) != null) {
            yield return line;
        }
    }
}

对于行的惰性评估:如果您有一个巨大的文件,并且只需要向用户显示前 10 行,这在将来会很有帮助。

然后调用:

return new LinkedList<string>(Lines(text));

编辑:

获取pairs,可以引入新的方法:

然后可以使用第二种方法将项目拆分成对:

public static KeyValuePair<string,string> SplitToKeyValue(string text) {
    Regex p = new Regex(@"^(\w+)\s+(.*)$");
    Match m = p.Match(text);
    return new KeyValuePair<string,string>(m.Groups[1].Value,m.Groups[2].Value);
}

然后创建LinkedList

return new LinkedList<KeyValuePair<string,string>>(Lines(text).Select(SplitToKeyValue));

演示版

使用 Mono 的 csharp 交互式 shell:

$ csharp
Mono C# Shell, type "help;" for help

Enter statements below.
csharp> using System.IO;
csharp> using System.Text.RegularExpressions;
csharp> public static class Foo {
      >  
      > public static KeyValuePair<string,string> SplitToKeyValue(string text) {
      >     Regex p = new Regex(@"^(\w+)\s+(.*)$");
      >     Match m = p.Match(text);
      >     return new KeyValuePair<string,string>(m.Groups[1].Value,m.Groups[2].Value);
      > }
      >  
      > public static IEnumerable<string> Lines (string text) { 
      >     string line;
      >     using (StringReader reader = new StringReader(text)) {
      >         while ((line = reader.ReadLine()) != null) {
      >             yield return line;
      >         }
      >     }
      > }
      >  
      > }
csharp> string inp = "LOAD =5.01E+10\nMPY \nADD ";
csharp> new LinkedList<KeyValuePair<string,string>>(Foo.Lines(inp).Select(Foo.SplitToKeyValue)) 
{ [LOAD, =5.01E+10], [MPY, ], [ADD, ] }

fiddle.

我知道您需要将字符串转换为列表。如果正确,那么解决方案是

 Regex.Matches("your string","\r\n", RegexOptions.Singleline|RegexOptions.IgnoreCase)

所以根据你的问题,我知道你需要将这个字符串转换成一个链表——键值对。这是一种方法:

编辑(抱歉这个问题有太多的编辑):

string input = "LOAD  =5.01E+10\r\nMPY   \r\nADD   ";

IEnumerable<KeyValuePair<string, string>> pairs =
    input.Split(new string[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
        .Select(x => x.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries))
        .Select(x => new KeyValuePair<string, string>(x[0], x[1]));

var data = new LinkedList<KeyValuePair<string, string>>(pairs);

编辑

下面是如何遍历链表:

foreach (KeyValuePair<string, string> pair in data) {
    Console.WriteLine("Key: {0} - Value: {1}", pair.Key, pair.Value);
}

或者获取一个节点并访问它的Value,也就是键值对:

KeyValuePair<string, string> p = data.First.Value;
string k = p.Key; // LOAD
string v = p.Value; // =5.01E+10