检查字符串是否包含密钥
本文关键字:密钥 包含 是否 字符串 检查 | 更新日期: 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 值包含一个逗号,这也将破坏代码。