【问题标题】:Query string using LINQ使用 LINQ 查询字符串
【发布时间】:2012-11-01 18:01:08
【问题描述】:

为了从 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 或其他东西进行查询,而不是遍历每一行,切换第一个字符,然后将其余字符存储为一个值,因为这种方法对故障和错误非常敏感(比如当 2 个属性/params 位于 1 行,或者第一个字符不是意外的正确字符(例如,前面有一个空格)。在我开始介绍所有可能发生的该死异常之前,我想知道是否有一种技术可以使用 LINQ 查询字符串中的值/键。

【问题讨论】:

  • 您要存储什么预期结果?
  • m 键有三个项目。你想怎么处理?
  • @CuongLe 对于像 v,o,s 这样的唯一键,我有特定的变量。对于像 m 这样的 * 键,如您在上面的示例中所见,我想使用列表。此示例中没有另一种类型的键/值:属性。它们的写法如下:'a=fmpt:RTP/96' 所以我想查询属性(a's),然后查询键(之前的字符串:)和值(之后的字符串:)

标签: c# string linq


【解决方案1】:
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

【讨论】:

  • 这个!一百次!非常感谢您提供这个易于理解的示例。
【解决方案2】:

你无疑可以用 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
        }
    }
}

【讨论】:

  • 一行出现2个键/值对的情况如何?在这种情况下,ReadLine 将毫无用处。
  • @user1450661 那么你需要定义在这种情况下正确的行为是什么(你还没有完成)......在我看来这是一个错误场景,并且用户 不应该期望它会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多