3

有一个字符串具有以下键值对。它被“,”分隔,所以在分割之后。

 string[] strSubject = certificate.Subject.Split(',');

            [0] "E=ankurda@aol.com" 
        [1] " CN=Ankur" 
        [2] " OU=Telco" 
        [3] " O=aol"    
        [4] " L=Mum"    
        [5] " S=Mh"
        [6] " C=IN" 

该值是键值对的组合,键名固定。问题是并非必须拥有所有对象的所有键。这意味着对于某些对象,它将具有一些值,例如

            [0] "E=ankurda@aol.com" 
        [1] " CN=Ankur" 
        [2] " S=Mh"
        [3] " C=IN" 

所以我不能硬编码索引并通过做这样的事情来获取值

String value = strSubject[5].Replace("S=",string.Empty));

我也尝试过像这样使用 .contains

if (strSubject.Contains("C="))//Don't Know the value part as it is dynamic
   {
//this does not work
   }

如何获取拆分后存在的键的值。Linq 查询能否获取不确定的值。

4

9 回答 9

2

创建一个字典并查询:

var testStr = "E=foo,B=Bar,O=aol,FAIL";

var dict = testStr.Split(',').Where(x => x.Contains("="))
   .Select(x => x.Trim().Split('=')).ToDictionary(x => x[0], x=> x[1]);

dict.ContainsKey("theKey");

(这也为您提供了一种处理查询的便捷方式。)

于 2013-10-23T10:44:08.207 回答
2

你应该做的是将字符串解析成类似的东西Dictionary<string, string>,使用它会更容易。

类似的东西(假设后面的空间,是必需的):

var subjectDictionary = certificate.Subject
    .Split(new[] { ", " }, StringSplitOptions.None)
    .Select(pair => pair.Split('='))
    .ToDictionary(pair => pair[0], pair => pair[1])

if (subjectDictionary.ContainsKey("C"))
{
   var valueForC = subjectDictionary["C"];
   …
}
于 2013-10-23T10:44:59.333 回答
1

我想这样的事情应该有效..

string[] strSubject = certificate.Subject.Split(',');
for (int i = 0; i < strSubject.Length; i++)
{
   string[] row = strSubject[i].Split('=');

   switch (row[0]) // the key
   {
        case "E": 
            // do something, value is stored in row[1]
            break;
        case "CN":
            // do something else
            break;
        //... cover the expected keys
   }
}
于 2013-10-23T10:35:01.317 回答
0
for(var i=0;i<strSubject.Length;i++)
{
      if(strSubject[i].Trim().StartsWith("C="))
      {
               //perform your action
      }
}
于 2013-10-23T10:40:33.730 回答
0

解析专有名称可能具有挑战性。我建议您在此处考虑 Hall72215 的答案,或者在代码项目上考虑这个项目,以获得托管代码中的解决方案。

如果您有相同名称的 RDN,faester 接受的答案将会中断,这对于专有名称来说很常见。例如来自 Verisign 的这个证书:

OU = NO LIABILITY ACCEPTED, (c)97 VeriSign, Inc., OU = VeriSign Time Stamping Service, Root OU = VeriSign, Inc., O = VeriSign Trust Network

这里有两次 OU,其中一个 OU 值包含一个逗号,这也会破坏代码。

于 2013-10-23T11:12:27.593 回答
0

我喜欢用yourWord.IndexOf(inputString) != 0

所以使用System.Linq

var match = yourWords.ToList().FirstOrDefault(x => x.ToLower().IndexOf(inputString) != 0);

但是有很多其他方法可以做到这一点。选择你的最爱!

于 2013-10-23T10:38:02.557 回答
0

尝试获取所有键和值:

var q = certificate.Subject.Split(',')
    .Select(x => x.Trim())
    .Select(x => new
    {
        key = x.Substring(0, x.IndexOf('=')).Trim(),
        value = x.Substring(x.IndexOf('=') + 1).Trim()
    });

然后:

foreach (var x in q)
{
    if (x.key == "C")
    {
        // code
    }
}
于 2013-10-23T10:42:28.727 回答
0

我不确定您的目标到底是什么,但是如果您再次使用“=”作为分隔符进行拆分会怎样:

string[] strParts = theValue.Split("=");

比您分别拥有 和 中的键和strParts[0]strParts[1]

于 2013-10-23T10:43:59.600 回答
0

要获取值,只需使用这行代码:

var values = strSubject.Select(v => v.Split('=')[1]);

对于键值:

var values = strSubject.Select(v => new { Key = v.Split('=')[0], Value = v.Split('=')[1] });
于 2013-10-23T10:44:36.510 回答