为什么我不能在 C# 中访问我的字典中的特定键?

Why can't I access a specific Key within my Dictionary in C#?

我已尽我所能将其分解。

这是相关代码,我对每一行的作用做了最好的解释。

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 进行了一些调试,这是控制台中的(因河马原因而更改)输出。它将字典的内容显示为字符串,我可以清楚地看到存在哪些键和值。

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

存在密钥错误

但每当我尝试使用

访问数据时
var cliID = uDict["individualID"];

我收到错误提示“individualID”键不存在,尽管我在输出中看到它存在??

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

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

感谢您的宝贵时间。

您的词典包含:

individualID=-----,

您的查询似乎是:

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

Exist key False

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

在 post 的其他地方,您指出您正在查找 uDict["individualID"],其中 正确的大小写;如果你真的明白了,我会猜测它不是你认为的 uDict,例如你有一个 clas level uDict 变量和一个同名的本地变量,你把它们弄糊涂了,等等

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

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

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

比那些乱七八糟的字符串要好得多:)

这应该可以通过 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
    }