检查String是否包含密钥

时间:2013-10-23 10:32:44

标签: c# linq

有一个字符串具有以下键值对。它被分隔为“,”因此将它拆分后。

 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查询可以获取不确定的值。

9 个答案:

答案 0 :(得分: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");

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

答案 1 :(得分: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"];
   …
}

答案 2 :(得分: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
   }
}

答案 3 :(得分:0)

我想使用yourWord.IndexOf(inputString) != 0

所以使用System.Linq

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

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

答案 4 :(得分:0)

for(var i=0;i<strSubject.Length;i++)
{
      if(strSubject[i].Trim().StartsWith("C="))
      {
               //perform your action
      }
}

答案 5 :(得分: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
    }
}

答案 6 :(得分:0)

我不确定你的目标究竟是什么,但是如果再次使用'='作为分隔符进行拆分会怎么样:

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

分别拥有strParts[0]strParts[1]中的密钥和值。

答案 7 :(得分:0)

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

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

对于键值:

var values = strSubject.Select(v => new { Key = v.Split('=')[0], Value = v.Split('=')[1] });

答案 8 :(得分:0)

解析专有名称可能具有挑战性。我建议您考虑Hall72215对托管代码中解决方案的代码项目的herethis项目。

如果您拥有同名的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值包含一个逗号,它也会破坏代码。