【问题标题】:Remove duplicate key from dictionary using linq in C#在 C# 中使用 linq 从字典中删除重复键
【发布时间】:2017-12-02 18:02:58
【问题描述】:

我已尝试使用以下代码在添加之前从字典中删除重复键。

示例代码:

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 = 主机,KeyValue[0].Value = 本地
KeyValue[1].Key = 用户名,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); 

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

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

谁能建议我如何解决这个问题?

提前致谢。

【问题讨论】:

  • 字典只允许唯一的键,所以你不能有重复。
  • 为什么一定要使用linq?

标签: c# linq dictionary


【解决方案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]

【讨论】:

    【解决方案2】:

    正如@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);
    

    【讨论】:

      【解决方案3】:

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

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

      结果:

      Key         Value
      host        localhost
      username    UID
      password    PWD
      

      【讨论】:

        猜你喜欢
        • 2020-11-22
        • 2018-02-06
        • 1970-01-01
        • 2023-01-08
        • 2010-11-30
        • 1970-01-01
        • 2016-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多