0

RTSP から SDP 情報を解析するために、現在、デフォルトの c# 文字列関数 (文字列を 1 行ずつループするなど) と 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

この文字列は、各行を foreach する代わりに LINQ などを使用してクエリ可能であり、最初の文字を切り替えてから残りを値として保存できるのではないかと思っています。 1 行で、または最初の文字が誤って正しい文字ではありません (前にスペースがある場合など)。発生する可能性のある例外をすべて取り上げる前に、LINQ を使用して値/キーの文字列をクエリする手法があるかどうか疑問に思っています。

4

2 に答える 2

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
于 2012-11-01T09:53:54.223 に答える
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
        }
    }
}
于 2012-11-01T09:48:45.410 に答える