【问题标题】:How to retrieve key/value from Dictionary, and combine them to a string如何从字典中检索键/值,并将它们组合成一个字符串
【发布时间】:2015-10-21 06:50:04
【问题描述】:

我试图从字典中检索特定的一对,并将这对转换为字符串,如下所示:

        Dictionary<string, string> testDictionary= new Dictionary<string, string>();
        testDictionary.Add("3123", "1");
        testDictionary.Add("3523", "2");
        testDictionary.Add("5532", "1");

        string memberId="5532";
        string finalSelectedValue = testDictionary.Where(x => x.Key == memberId).Select(y => y.Key + "_" + y.Value).ToString();

        Console.WriteLine(finalSelectedValue);

但是,我不知道如何实现在字典中组合这个特定对的键和值的最后一步。

预期结果是:“5532_1”

【问题讨论】:

    标签: c# dictionary


    【解决方案1】:

    这里不需要 LINQ,因为字典不能有重复的键。您真正需要的 - 只需按键获取条目并格式化其值(字典对于此任务非常有效):

    string memberId = "5532";
    string value;
    
    if (testDictionary.TryGetValue(memberId, out value))
    {
        string finalSelectedValue = String.Format("{0}_{1}", memberId, value);
    }
    else
    {
        // member not found
    }
    

    性能较差,但单行:

    string finalSelectedValue = testDictionary.ContainsKey(memberId) ?
         $"{memberId}_{testDictionary[memberId]}" : null; // C# 6 string formatting
    

    为什么你的方法不起作用?您正在计算所有字典条目以查找字典中是否存在某些键(这是一个很大的矫枉过正)。 Where 运算符将返回空集合或带有单个条目的集合(因为字典不能有重复的键)。之后,您将过滤结果投影到字符串集合(同样是一个或零个项目)。然后您将集合转换为字符串 - 但这只会返回集合的类型名称IEnumerable&lt;string&gt;。要修复您的代码,您需要将最后一个ToString() 替换为FirstOrDefault(),如果找不到条目,​​您将获得单一格式的字符串或null。但是..见上文:)

    【讨论】:

    • 我喜欢这个解决方案。清晰安全。无需遍历键并首先放弃使用字典的整个效率部分。
    【解决方案2】:

    跳过 Linq 并执行此操作怎么样:

    string finalSelectedValue = memberId + "_" + testDictionary[memberId];
    

    testDictionary[memberId]将返回字典项memberId的值

    【讨论】:

      【解决方案3】:

      试试这个。

      var finalSelectedValue = testDictionary.Where(x => x.Key == memberId).Select(y => y.Key + "_" + y.Value).FirstOrDefault();
      

      【讨论】:

        【解决方案4】:
        var finalSelectedValue = string.Format("{0}_{1}", memberId, testDictionary[memberId]);
        

        【讨论】:

          【解决方案5】:

          Select 将返回一个IEnumerable&lt;KeyValuePair&gt;。在此 IEnumerable 上调用 ToString 不会给出您正在寻找的结果。虽然手动查找密钥并获取值可能很简单,但如果您在此处寻找 linq 解决方案,则需要使用以某种方式枚举返回的可枚举的调用来获取结果,例如 @ 987654323@、FirstOrDefaultSingleSingleOrDefault

          您也可以创建一个简单的Func 来执行此操作。您还应该定义当密钥不存在时会发生什么。我把它留作“?”在这里,因为它没有在您的帖子中解决。

          Func<Dictionary<string,string>,string,string> specificPair = 
              (d,key) => d.ContainsKey(key) ? key + "_" + d[key] : "?";
          

          然后随意使用

          string finalSelectedValue = specificPair(testDictionary,memberId);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-23
            • 1970-01-01
            • 1970-01-01
            • 2017-12-02
            • 1970-01-01
            相关资源
            最近更新 更多