繁体   English   中英

c#字典从键中选择值

[英]c# dictionary select value from key

我一直在这里搜索,我意识到以前也有人问过类似的问题,我已经看过几个,但似乎正确的方法似乎并不适用。

我有以下方法可以在从 SQL 查询收集的 DataSet 中提取一组键值对。

    public static Dictionary<string, string> LoadConfiguration()
    {
        DataSet sqlResults = data.GetSettings();

        Dictionary<string, string> dict = 
            new Dictionary<String, String>();

        foreach (DataRow dr in sqlResults.Tables[0].Rows)
        {
            dict.Add(
                dr.Field<string>("key"), dr.Field<string>("value")
                    );
        }

        return dict;
    }

据我所知,它很简单,但我以前从未真正使用过字典,因为我对任何类型的实际编程都比较陌生。

我知道我的字典有预期的数据,因为如果我用 foreach 遍历它,它会给我预期的结果

    foreach (KeyValuePair<string, string> i in MyStuff.Configuration.LoadConfiguration())
    {
        Console.WriteLine("Key = " + i.Key + " Value = " + i.Value);
    }

这给了我以下内容,这是我迄今为止实施的全部内容

Key = EnableLdap Value = false Key = LdapPath Value = LDAP://DC=some,DC=domain,DC=com Key = SessionTimeout Value = 60

但我只想从名为 EnableLdap 的键中选择一个特定的值,例如

我的理解是以下两种方法都是正确的。 但是当我尝试这种方式时,我得到一个 KeyNotFoundException

    Dictionary<string,string> dict = MyStuff.Configuration.LoadConfiguration();
    Console.WriteLine(dict["EnableLdap"]);

如果我尝试这个,我会得到一个 [InvalidOperationException: Sequence contains no matching element]

    Dictionary<string,string> dict = MyStuff.Configuration.LoadConfiguration();
    Console.WriteLine(dict.Single(s => s.Key == "EnableLdap").Value);

如果我尝试这个,我什么也得不到

    string value = "";

    if (dict.TryGetValue("EnableLdap", out value))
    {
        dict["EnableLdap"] = value;
        Console.WriteLine(value);

    }

我很确定我在这里遗漏了一些简单的东西,答案将导致面部表情

解决方案:

正如评论中多次建议的那样,我被尾随空格抓住了。 解决方案是在将行值添加到我的字典时简单地向我的行值添加一些修剪。

public static Dictionary<string, string> LoadConfiguration()
{
    DataSet sqlResults = data.GetSettings();

    Dictionary<string, string> dict = 
        new Dictionary<String, String>();

    foreach (DataRow dr in sqlResults.Tables[0].Rows)
    {
        dict.Add(
            dr.Field<string>("key").Trim(), dr.Field<string>("value").Trim()
                );
    }

    return dict;
}

这是这两个问题之一。

  1. 字典中不存在键,这可能是由于拼写错误,甚至是前导/尾随空格或类似性质的东西。
  2. 密钥存在,但大小写与您认为的不同。

对于选项 2,您可以通过向字典提供StringComparer作为构造函数中的参数来确保大小写不是问题。

Dictionary<string, string> dict = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);

上面的代码片段将确保字典根据字符串键的顺序大小写不敏感表示为每个键创建哈希。 这将允许以下示例通过:

dict["enableldap"] = "true";
Console.WriteLine(dict["EnableLdap"]);

有关更多选项,请参阅StringComparer

我的理解是以下两种方法都是正确的。 但是当我尝试这种方式时,我得到一个 KeyNotFoundException

你的字典好像没有那个键。 请记住,字典是键敏感的,您可以使用此方法检查键是否存在:

Console.WriteLine("Exist key "+ dict.ContainsKey("EnableLdap"));

如果我尝试这个,我会得到一个 [InvalidOperationException: Sequence contains no matching element]

  Dictionary<string,string> dict = MyStuff.Configuration.LoadConfiguration();
    Console.WriteLine(dict.Single(s => s.Key == "EnableLdap").Value);

LINQ的方法.Single希望找到一个值。 如果没有找到值,将抛出异常。 如果您不想要该异常,您应该使用.SingleOrDefault ,但要注意空值。

如果我尝试这个,我什么也得不到

TryGetValue 不会抛出任何异常。 它只是尝试。

我建议您在创建字典时为大写或小写的键添加格式。

foreach (DataRow dr in sqlResults.Tables[0].Rows)
        {
            dict.Add(
                dr.Field<string>("key").ToUpperCase(), dr.Field<string>("value")
                    );
        }

然后你可以这样查询:

if(dict.ContainsKey("ENABLELDAP"))
{
   string value = dict["ENABLELDAP"];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM