【问题标题】:Why can't I access a specific Key within my Dictionary in C#?为什么我不能在 C# 中访问我的字典中的特定键?
【发布时间】:2021-09-24 01:16:37
【问题描述】:

我已尽力将其分解。

这是我对每一行功能的最佳解释的相关代码。

public static string DetailCall()
        {
            //Call original API POST Method to get Data
            string data = BlocCall();
            //Clean Data by removing extra characters
            var charsToRemove = new string[] { "{", "\"", " "};
            foreach (var c in charsToRemove)
            {
                data = data.Replace(c, string.Empty);
            }

            //Split string of data into an array of data by individual
            string[] guys = data.Split('}');
            
            //Do stuff with each persons data
            foreach (var individual in guys)
            {   
                //Split Data into key value pairs and add to Dictionary
                var uDict = individual.Split(',').Select(part => part.Split(':')).Where(part => part.Length == 2).ToDictionary(sp => sp[0], sp => sp[1]);

                //Turn the Dictionary back into a string for testing purposes
                var s_uDict = String.Join(",", uDict.Select(kvp => String.Format("{0}={1}", kvp.Key, kvp.Value)));

     
                Trace.WriteLine(s_uDict);

                Trace.WriteLine("Exist key " + uDict.ContainsKey("INDIVIDUALID"));     

            }
         }

我使用 Trace.WriteLine 进行了一些调试,这是控制台中的(由于 hippa 原因而更改)输出。它将字典的内容显示为字符串,我可以清楚地看到存在哪些键和值。

个人ID=-----,
名字=--------,
中间首字母=,
姓氏=--------,
电子邮件=--------@gmail.com,
ssn=,
状态=01.FreshLead,
类型=,
homePhone=(---)--------,
业务电话=,
手机=

存在键 False

但是每当我尝试使用访问数据时

var cliID = uDict["individualID"];

我得到了“individualID”键不存在的错误,即使我可以在输出中看到它存在??

我也尝试了其他键值并得到相同的结果。

在这一点上我很困惑,希望有人能帮我解决这个问题。

感谢您的宝贵时间。

【问题讨论】:

  • 你能显示你的字符串数据吗?
  • @Serge 如果 OP 显示示例数据,则无法按要求回答问题 - 如果您查看代码的清理部分,您可以看到原始数据是 JSON 并且所有结构都被剥离与string.Replace。这将在类似的评论风暴中结束,就好像一个人试图用 RegEx 解析 HTML...(如果 OP 实际上提供了 minimal reproducible example 内联数据,那就太好了)

标签: c# api dictionary key-value


【解决方案1】:

您的字典包含:

个人ID=-----,

您的尝试似乎是:

Trace.WriteLine("Exist key " + uDict.ContainsKey("INDIVIDUALID"));

存在键 False

"INDIVIDUALID" 将具有与"individualID" 完全不同的哈希码;简而言之 - 字典键区分大小写

您在帖子的其他地方表示您正在查找uDict["individualID"] 是正确大小写的;如果你真的明白了,我会冒险猜测它不是你认为的uDict,例如你有一个类级别 uDict 变量和一个同名的本地变量,你让他们感到困惑,等等

我尝试重建您的输入字符串,代码看起来很好:https://dotnetfiddle.net/nNy8ar

阿列克谢的评论也很明智;您似乎正在滚动您自己的 JSON 解析器。不要打扰;你可以得到 Newtonsoft.Json(免费,使用 Nuget 包管理器来安装它)给你一个字典,而不需要所有这些 finagling:

string data = BlocCall(); //e.g. { "individualID":"hello", ... }
var d = JsonConvert.DeserializeObject<Dictionary<string,object>>(data);

Console.WriteLine(d["individualID"]); //hello

当然,像 NSJ 这样的 json deser 库的真正强大之处在于您可以让它为您提供适当的对象实例

public class Thing{
  [JsonProperty("individualID")]
  public string IndividualId {get; set;}
}

string data = BlocCall(); //e.g. { "individualID":"hello", ... }
var w = JsonConvert.DeserializeObject<Thing>(data);

Console.WriteLine(w.IndividualId); //hello

比所有字符串类型的废话好多了:)

【讨论】:

  • 哇,这太棒了。大写只是一个测试,我尝试了所有不同的情况。反序列化器会在 foreach 循环中工作吗? string[] guy = data.Split('}') 是将数据中的多个“个人”分开,如果有意义的话,我想为每个人做一些其他的事情。无论哪种方式,我现在都会试一试。
  • 所以,它也没有按照我理解的方式工作。此外,来自 BlocCall() 的 API 响应不是 JSON。这是一个文本/HTML 响应,读取为字符串...
  • 你能显示从 BlocCall 获得的实际完整字符串吗?
  • 对我来说当然看起来像 JSON .. 将其粘贴到 QuickType.io 以生成一堆 c# 类(就像我在答案 class Thing 中输入的那样,只是更完整),deser 的助手' ing,甚至还有一个评论区告诉你如何使用它
  • ? 是的,我也有这样的日子...... 10 小时以上的编码(多么轻量级),我达到了一个看不到树木的地步;我睡在上面,第二天我就像“这很容易,昨晚是WTH的问题吗?” - 有时多呆半个小时是不值得的;休息并在十分钟内完成它最终会节省更多时间;)但很高兴你到了那里 - 有一天它看起来很自然..
【解决方案2】:

Linq 应该可以做到这一点:

uDict.FirstOrDefault(item => item.Key == "individualID").Value

如果字典中的项目是individualID 并且您要求individualId,那么您确实需要注意字符串的大小写,这些是不同的键。如本例所示:

    public static void Main()
    {
        var dict = new Dictionary<string,string>();
        
        dict.Add("key", "Value");
        
        
        Console.WriteLine(dict.FirstOrDefault(x => x.Key == "KEY").Value);
        Console.WriteLine(dict.FirstOrDefault(x => x.Key == "kEY").Value);
        Console.WriteLine(dict.FirstOrDefault(x => x.Key == "KeY").Value);
        Console.WriteLine(dict.FirstOrDefault(x => x.Key == "KEy").Value);
        Console.WriteLine(dict.FirstOrDefault(x => x.Key == "Key").Value);
        Console.WriteLine(dict.FirstOrDefault(x => x.Key == "key").Value); //<-- this is the only processed line
    }

【讨论】:

  • 不要这样做;如果您要枚举它以查找您想要的键,那么拥有一本字典根本没有意义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多