有没有从哈希表中获取布尔值的好方法

本文关键字:方法 布尔值 获取 哈希表 有没有 | 更新日期: 2023-09-27 18:35:27

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

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;

布尔值有更好的解决方案吗?

有没有从哈希表中获取布尔值的好方法

好吧,如果必须使用哈希表(或者出于其他原因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

快乐编码。

不要使用哈希表。自从.NET 2.0问世以来,这些已经过时了七年。请改用泛型集合,如 Dictionary

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

泛型真的很棒。帮自己一个忙,花几个小时研究它们。你可以从这里开始,从MSDN,我真的很喜欢Jon Skeet的书,C#深入,它涵盖了这个主题......深入。

您可以使用扩展方法来帮助使工作更易于忍受:

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);

您可以轻松地对其进行调整,以便在正确的位置处理异常,或者记录缺失值或类型不匹配的情况。

你应该使用泛型

Dictionary<string, bool> 

而不是(过时的)哈希表。

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