检查字符串是否包含密钥

本文关键字:密钥 包含 是否 字符串 检查 | 更新日期: 2023-09-27 18:36:36

有一个字符串具有以下键值对。它被","分开后

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

检查字符串是否包含密钥

创建一个字典并查询:

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");

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

你应该做的是将字符串解析成类似 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"];
   …
}

我想这样的事情应该可以工作。

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
   }
}

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

所以使用System.Linq

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

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

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

尝试获取所有键和值:

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
    }
}

我不确定你的目标到底是什么,但是如果你再次使用"="作为分隔符进行拆分怎么办:

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

比你分别拥有strParts[0]strParts[1]中的键和值。

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

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

对于键值:

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

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

如果您拥有具有相同名称的 RDN,Faester 接受的答案将中断,这对于可分辨名称来说很常见。例如,威瑞信的证书:

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

在这里,您有两个 OU 出现,其中一个 OU 值包含一个逗号,这也将破坏代码。