2015-01-08 89 views
2

我有一個字符串,並希望將其轉換爲LinkedList,以便每行都是單個元素。如何將字符串與一些「 r n」轉換爲列表?

我使用Visual Studio 2012

有沒有簡單的方法來做到這一點?

這個字符串的樣子:

LOAD =5.01E+10 
MPY $1 
ADD $2 

但實際上它包含LOAD =5.01E+10\r\nMPY $1\r\nADD $2

重要更新:我並不需要刪除 「\ r \ n」 或這樣的事情。我需要在每個元素中使用「左邊部分」和「右邊部分」對的列表(實際上不鏈接)。什麼樣的名單我怎樣從前面的例子中得到舉例:

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

其實,更好地節省左側畢竟這個自由的空間。

+0

在* Windows *環境中,它是'\ r \ n',在* Linux *上,它是'\ n'。 –

+0

你的意思是'var lines = myString.Split(new [] {「\ r \ n」,「\ n」},StringSplitOptions.None).ToList();' – StuartLC

+0

@InfernumDeus:你用什麼類型帕爾斯? 'KeyValuePair'? –

回答

4

所以,從你的問題,我得到你需要這個字符串變成一個鏈表 - 鍵,值對。這裏是一個辦法做到這一點:

編輯(抱歉,這個問題有太多可編輯):

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

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,這是key-val ue pair:

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

這是一個'Dictionary',訂單不再維護... –

+1

是的,我必須保存訂單。 – InfernumDeus

+2

@InfernumDeus在這裏,如果我正確地理解了你的話,我已經將它改爲了'LinkedList'。 –

0

是,

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

http://www.dotnetperls.com/newline

+1

這個問題的問題是,在真正的問題是隻在標題中指定... –

0

這裏是輸出

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

輸出

5.01E+10 MPY $1 ADD $2 
4

換行表示可以依賴於環境的方法: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)); 

編輯:

要獲得對,你可以引入一個新的方法:

第二種方法則可以使用拆分項目成對:

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

然後cre吃LinkedList有:使用Mono的csharp交互shell

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

DEMO

$ 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 $1\nADD $2"; 
csharp> new LinkedList<KeyValuePair<string,string>>(Foo.Lines(inp).Select(Foo.SplitToKeyValue)) 
{ [LOAD, =5.01E+10], [MPY, $1], [ADD, $2] } 

fiddle

+1

偉大的去懶惰評估的路線 – paulroho

+0

@ paulroho:不僅因爲懶惰。 'IEnumerable '也強制人們思考更多*聲明性*,一種據說更安全的心態......)。 –

+2

如果你想放置易於運行的演示去嘗試https://dotnetfiddle.net/它是一個單一的C#shell的Web前端,並讓你有直接運行的鏈接到你寫的程序。它非常適合在這個網站上找到答案。 –

0

我明白你需要將字符串轉換爲列表。如果是正確的,然後解決方案是

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