拆分为KeyValuePair而不是Array

时间:2013-07-23 17:14:00

标签: linq keyvaluepair

我有一串数据:

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,但我似乎无法加入这些问题和我的问题,所以如果我不小心发布了一份副本,请原谅我。

非常感谢任何帮助,谢谢:)

3 个答案:

答案 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();

使用LINQ查询语法

如果我将上述行转换为查询语法:

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
}