关于访问字典的值

时间:2012-01-04 14:49:13

标签: c# dictionary

这是一个菜鸟问题,我知道,但我没有在互联网上找到答案......

我得到以下词典:

private static Dictionary<Qb.Solution.QbDataStore.DataStoreType, string> DataStoreType2IconPath = new Dictionary<QbDataStore.DataStoreType, string>()
{
    { Qb.Solution.QbDataStore.DataStoreType.CommonData, "Common" },
    { Qb.Solution.QbDataStore.DataStoreType.ApplicationData, "Application" },
    { Qb.Solution.QbDataStore.DataStoreType.FrameData, "Frame" }
};

然后我有一个Qb.Solution.QbDataStore.DataStoreType dataType参数的方法,我得到了这个:

if (dataType != null)
{
    collection.IconPath = DataStoreType2IconPath[dataType];
}

我的问题是:

如果我删除if测试,并且我不知道(理论上不可能)dataType为null:

  1. collection.IconPath是否为空?
  2. 它会抛出异常吗?

4 个答案:

答案 0 :(得分:3)

它会抛出一个异常,所以你用if测试会更好。

您也可以使用TryGetValue执行此操作:http://msdn.microsoft.com/fr-fr/library/bb347013.aspx

答案 1 :(得分:2)

如果您尝试从字典中检索不存在的条目,则会引发KeyNotFoundException,请参阅MSDN documentation。如果这不是您想要的行为,请改用TryGetValue方法。

答案 2 :(得分:2)

根据我的快速测试,向字典添加空键会导致ArgumentNullException并尝试检索不存在的密钥会导致KeyNotFoundException

namespace ConsoleApplication46
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var d = new Dictionary<string, int>();

            d.Add(null, 1);

            Console.WriteLine(d["adam"]);
            Console.Read();
        }
    }
}

关于如何最好地编写代码的代码,请尝试https://codereview.stackexchange.com/

替代方法包括TryGetValueContainsKey

答案 3 :(得分:1)

如前所述,您无法在字典中添加空键 - http://msdn.microsoft.com/en-us/library/k7z0zy8k.aspx

您可能希望使用ContainsKey()方法检查密钥是否存在,而不是使用TryGetValue或捕获异常。 (你仍然需要一个带有TryGetValue的if语句,如果你能提供帮助,最好不要使用逻辑异常进行编程。)

if (DataStoreType2IconPath.ContainsKey(dataType))
{
    collection.IconPath = DataStoreType2IconPath[dataType];
}

如果确实想要避免使用if语句,则可以使用条件运算符:

collection.IconPath = DataStoreType2IconPath.ContainsKey(dataType) ?
                        DataStoreType2IconPath[dataType] : null;

我个人更喜欢这种“表达”式的编程而不是语句,但那只是我。 : - )