有没有从哈希表中获取布尔值的好方法
本文关键字:方法 布尔值 获取 哈希表 有没有 | 更新日期: 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;
}