为什么我不能在 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
}
我已尽我所能将其分解。
这是相关代码,我对每一行的作用做了最好的解释。
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
}