簡體   English   中英

使用LINQ查詢字符串

[英]Query string using LINQ

為了從RTSP解析SDP信息,當前我使用默認的c#字符串函數(如逐行循環字符串)和foreach / switch方法。 默認SDP信息以以下形式來自設備:

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
e=mjh@isi.edu (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或其他方式查詢此字符串,而不是遍歷每一行,切換第一個字符,然后將其余字符存儲為值,因為此方法對故障和錯誤非常敏感(例如當兩個屬性/參數為在第一行上,或者第一個字符不是偶然的正確字符(例如,前面有一個空格)。 在我開始討論每一個該死的異常之前,我想知道是否有一種使用LINQ在字符串中查詢值/鍵的技術。

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

您無疑可以使用linq 做到這一點,但是一個簡單的循環(可能使用StringReader來獲取行)檢查line.Length != 0然后看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
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM