使用C#中的linq从字典中删除重复键

时间:2017-12-02 18:02:58

标签: c# linq dictionary

在添加之前,我尝试过以下代码从字典中删除重复的密钥。

示例代码:

string conString = "Host = local;UserName = UID; Password = PWD;Host =localhost";
        var sp = conString.Split(';');
        Dictionary<string, string> keyValue = new Dictionary<string, string>();
        foreach (var k in sp)
        {
            if (k.Contains('='))
            {
                var conSP = k.Split(new char[] { '=' }, 2);
                if (keyValue.All(i =>
                 i.Key != conSP[0]))
                    keyValue.Add(conSP[0], conSP[1]);
            }
        }

示例结果

KeyValue [0] .Key = Host,KeyValue [0] .Value = local
KeyValue [1] .Key = username,KeyValue [1] .Value = UID
KeyValue [2] .Key =密码,KeyValue [2] .Value = PWD

但我使用linq需要相同的结果。所以我尝试使用linq下面的代码来获取输出。

var keyValue = conString.Split(';')
                               .Where(kvp => kvp.Contains('='))
                               .Select(kvp => kvp.Split(new char[] { '=' }, 2))
                               .ToDictionary(kvp => kvp[0].Trim(),kvp => kvp[1].Trim(),StringComparer.InvariantCultureIgnoreCase); 

但是在这段代码中我得到了以下异常。

“已添加具有相同键的项目”

有人可以建议我如何解决这个问题吗?

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以尝试此LINQ查询:

var d = sp.Select(x => x.Split('='))
          .GroupBy(x => x[0])
          .Select(x => x.First())
          .ToDictionary(x => x[0], x=> x[1]);

结果:

[Host ,  local]
[UserName ,  UID]
[Password ,  PWD]

答案 1 :(得分:0)

正如@Sedat Kapanoglu所描述的那样;你不应该添加重复的项目。您应该在添加之前检查它。 因此,要删除重复项,您可以像这样执行它;

        var keyValue = conString.Split(';')
            .Where(kvp => kvp.Contains('='))
            .Select(kvp => kvp.Split(new char[] { '=' }, 2))
            .GroupBy(kvp => kvp[0])
            .Select(kvp => kvp.FirstOrDefault())
            .ToDictionary(kvp => kvp[0].Trim(), kvp => kvp[1].Trim(), StringComparer.InvariantCultureIgnoreCase);

答案 2 :(得分:0)

Connection String Builder更适合解析连接字符串,但它保留最后一个值:

new System.Data.Odbc.OdbcConnectionStringBuilder(
                              "Host = local;UserName = UID; Password = PWD;Host =localhost")

结果:

Key         Value
host        localhost
username    UID
password    PWD