2012-11-01 82 views
0

對於從RTSP解析SDP信息,目前我使用默認的c#字符串函數(如逐行循環字符串)和foreach/switch方法。默認SDP信息來自一個設備以這種形式:使用LINQ查詢字符串

v=0 
o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4 
s=SDP Seminar 
i=A Seminar on the session description protocol 
u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps 
[email protected] (Mark Handley) 
c=IN IP4 224.2.17.12/127 
t=2873397496 2873404696 
a=recvonly 
m=audio 3456 RTP/AVP 0 
m=video 2232 RTP/AVP 31 
m=whiteboard 32416 UDP WB 
a=orient:portrait 

我想知道是該字符串是查詢能夠使用LINQ或東西代替foreaching每一行中,切換第一字符,然後存儲該其餘部分的值,因爲這種方法對故障和錯誤非常敏感(例如,當2個屬性/參數在1行上,或者第一個字符不是偶然的正確的時候(例如,之前有空格))。在開始討論每一個可能發生的異常之前,我想知道是否有一種技術可以使用LINQ來查詢字符串的值/鍵。

+0

什麼預期要存儲的結果? –

+0

你有三個'm'鍵。你想如何處理? –

+0

@CuongLe對於像v,o,s這樣的唯一鍵,我有特定的變量。對於像m這樣的鍵,就像你在上面的例子中看到的那樣,我想使用列表。在這個例子中還有另一種類型的鍵/值:屬性。它們被寫成如下: 'a = fmpt:RTP/96' 所以我想查詢屬性(a's),然後查詢鍵值(字符串在:)之前和值(字符串在:)之後 – user1450661

回答

3
var query = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries) 
       .Select(line => line.Split('=')) 
       .GroupBy(x => x[0], x => x[1]) 
       .Select(g => new { Key = g.Key, Values = g.ToList() }); 

這將返回按鍵分組的條目,其值爲列表。

還是這樣(LINQ的,如果查找合適嗎):

var lookup = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries) 
       .Select(line => line.Split('=')) 
       .ToLookup(x => x[0], x => x[1]); 

用法:

foreach (var value in lookup["m"]) 
    // use value 
+0

這個!百倍!非常感謝你爲這個可以理解的例子。 – user1450661

1

你無疑可以使用LINQ,但一個簡單的循環做(也許使用StringReader得到線)檢查line.Length != 0然後尋找和line[0]line.Substring(1)可能更合適:

static void Process(string input) 
{ 
    using (var reader = new StringReader(input)) 
    { 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
      if(line.Length == 0) continue; 

      char first = line[0]; 
      string rest = line.Substring(1); 
      // ... process this line 
     } 
    } 
} 
+0

在一行上出現2個鍵/值對的情況?在這種情況下,ReadLine將毫無用處。 – user1450661

+0

@ user1450661然後你需要定義什麼正確的行爲在這種情況下(你還沒有完成)......這聽起來像這是一個錯誤的情況下,用戶**不應該期望**它工作。 –