有没有一种从Hashtable获取布尔值的好方法?

时间:2012-05-28 05:38:59

标签: c#

我正在尝试从哈希表中检索一个布尔值...我的代码看起来像这样:

Hashtable h = new Hastable();

...

h["foo"] = true;

...

object o = h["foo"];
if( o == null ) { return false; }
if( o.GetType() != typeof(bool) ) { return false; }
return (bool)o;

相比之下,我对对象使用这样的东西

return h["foo"] as MyObject;

布尔有没有更好的解决方案?

5 个答案:

答案 0 :(得分:6)

好吧,如果必须使用Hashtable (或出于其他原因键入数据object),请考虑:

object obj = true;
bool b = (obj as bool?) ?? false;
// b -> true

object obj = "hello";
bool b = (obj as bool?) ?? false;
// b -> false

也就是说,bool?(或Nullable<bool>)很高兴成为as目标(因为null是可空类型的有效值)并且结果很容易合并(??)到bool

快乐的编码。

答案 1 :(得分:2)

不要使用Hashtables。自.NET 2.0问世以来,已经淘汰了七年。请改用通用集合,例如Dictionary

Dictionary<string, bool> myDict = new Dictionary<string, bool>();
myDict["foo"] = true;

bool myBool = myDict["foo"];

泛型非常精彩。帮自己一个忙,花几个小时研究它们。你可以开始here, with MSDN,我非常喜欢Jon Skeet的书,C# in Depth,它深入探讨了这个主题。

答案 2 :(得分:2)

您可以使用扩展方法来帮助使工作更具可忍性:

public static class IDictionaryExtensions
{
    public static T? GetValue<T>(this IDictionary dictionary, object key) 
                  where T : struct
    {
        if (!dictionary.Contains(key))
            return null;
        object o = dictionary[key];
        if (o == null)
            return null;
        if (!(o is T))
            return null;
        return (T) o;
    }

    public static T GetValue<T>(this IDictionary dictionary, object key,
                                T defaultValue) where T : struct
    {
        return dictionary.GetValue<T>(key) ?? defaultValue;
    }
}

用作:

return h.GetValue("foo", false);

您可以轻松地将其修改为在正确的位置转换异常,或者记录缺失值或类型不匹配。

答案 3 :(得分:1)

您应该使用通用

Dictionary<string, bool> 

而不是(过时的)Hashtable。

答案 4 :(得分:0)

bool bVal = false;
object oVal;
if (hash.TryGetValue("foo", out oVal)) {
    bVal = (bool) oVal;
}