我有一串数据:
Key1=Value1,Key2=Value2,KeyN=ValueN
我正在尝试将字符串拆分为
List<KeyValuePair<string, string>>
我可以很容易地做到这一点:
List<string[]> values = item.Split( ',' ).Select( p => p.Split( '=' ) ).ToList();
但我无法弄清楚如何将其纳入KeyValuePair列表中。我到目前为止最接近的是:
List<KeyValuePair<string, string>> values = item.Split( ',' )
.Select( p => new KeyValuePair<string, string>(){ p.Split( '=' ) } ).ToList();
但那仍然有点偏执:(
我知道我可以通过循环轻松完成它但我真的很想让它在Linq中运行,因为练习是完美的。我已经看过很多类似问题的例子,比如this one,但我似乎无法加入这些问题和我的问题,所以如果我不小心发布了一份副本,请原谅我。
非常感谢任何帮助,谢谢:)
答案 0 :(得分:3)
到目前为止你做的很好。然后,您有两种方法可以实现您的目标:
ToKeyValuePair
public static KeyValuePair<string, string> ToKeyValuePair(string[] array)
{
if (array.Length != 2)
throw new ArgumentException("The array must contain exactly 2 elements.");
return new KeyValuePair<string, string>(array[0], array[1]);
}
var values = (item.Split( ',' )
.Select( p => ToKeyValuePair(p.Split( '=' ))))
.ToList();
如果我将上述行转换为查询语法:
var values = (from p in item.Split( ',' )
select ToKeyValuePair(p.Split( '=' )))
.ToList();
没有太大变化。
但是,多亏了这个新语法,由于ToKeyValuePair(...)
子句,很容易删除let
的用法:
var values = (from p in item.Split( ',' )
let splittedP = p.Split( '=' ) // Declares a variable
select new KeyValuePair<string, string>(splittedP[0], splittedP[1]))
.ToList();
当然,最后一行可以使用Extention方法语法编写(即使用.Select(p=>...)
),但很难阅读:
var values = (item.Split(',')
.Select(p => new { p, splittedP = p.Split('=') })
.Select(p => new KeyValuePair<string, string>(p.splittedP[0], p.splittedP[1])))
.ToList();
答案 1 :(得分:1)
我知道这是一个老问题,但我在谷歌上偶然发现了它。我使用接受的答案解决了问题,但稍微缩短了一点。您不需要new { p, splittedP = p.Split('=') }
部分,只需p.Split('=')
var values = data.Split(',').Select(p=>p.Split('='))
.Select(s => new KeyValuePair<string, string>(s[0], s[1]))
.ToList();
如果您的密钥是唯一的,您也可以这样做:
var values = data.Split(',').Select(p => p.Split('='))
.ToDictionary(k => k[0], v => v[1]);
哪个更短,基本上可以获得一个带O(1)访问权限的列表。
(这是使用.NET 4.5)
答案 2 :(得分:0)
使用上面的代码。必须修剪钥匙。
public static string GetUserInfo(this X509Certificate2 x509,X509Oid oid)
{
try
{
var kvs = x509.Subject.Split(',').Select(x => new KeyValuePair<string, string>(x.Split('=')[0].Trim(), x.Split('=')[1].Trim())).ToList();
string value = kvs.FirstOrDefault(A => A.Key == oid.ToString()).Value;
return value;
}
catch (Exception)
{
}
return "";
}
添加枚举文件。
public enum X509Oid
{
O,
E,
L,
C,
S,
G,
SN,
CN,
Street
}