Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ查询字符串_C#_String_Linq - Fatal编程技术网

C# 使用LINQ查询字符串

C# 使用LINQ查询字符串,c#,string,linq,C#,String,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=

为了解析来自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查询字符串中的值/键。

毫无疑问,您可以使用LINQ进行查询,但需要一个简单的循环(可能使用
StringReader
来获取行)检查
line.Length!=0
然后查看
line[0]
line。子字符串(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
        }
    }
}
毫无疑问,您可以使用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
        }
    }
}
这将返回按键分组的条目,其值为列表

或者通过这种方式(如果Linq查找适合您):

用法:

foreach (var value in lookup["m"])
    // use value
这将返回按键分组的条目,其值为列表

或者通过这种方式(如果Linq查找适合您):

用法:

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

您希望存储的预期结果是什么?对于
m
key,您有三个项。您应该如何处理这些项?@CuongLe对于像v、o、s这样的唯一键,我有特定的变量。对于像m这样的*键,正如您在上面的示例中看到的,我希望使用列表。还有另一种类型的键/值不在本例中:属性。它们被写为following:'a=fmpt:RTP/96'因此我想查询属性(a),然后查询键(前面的字符串:)和值(后面的字符串:)您希望存储的预期结果是什么?对于
m
key,您有三个项。您应该如何处理这些项?@CuongLe对于像v、o、s这样的唯一键,我有特定的变量。对于像m这样的*键,正如您在上面的示例中看到的,我希望使用列表。还有另一种类型的键/值不在本例中:属性。它们被写为following:'a=fmpt:RTP/96'所以我想查询属性(a),然后查询键(前面的字符串:)和值(后面的字符串:)当一行上出现两个键/值对时,情况如何?在这种情况下,ReadLine将是无用的。@user1450661然后您需要定义这种情况下的正确行为(您还没有这样做)…在我看来,这是一个错误场景,用户不应该期望它工作。如果一行上出现两个键/值对,情况会怎样?在这种情况下,ReadLine将是无用的。@user1450661那么您需要定义在这种情况下的正确行为(您还没有这样做)…在我看来,这是一个错误场景,用户不应该期望它工作。这!一百次!非常感谢您提供了这个可以理解的示例。这!一百次!非常感谢您提供了这个可以理解的示例。