2012-05-28 92 views
4

我試圖從一個哈希表中檢索一個布爾...我的代碼看起來是這樣的:有沒有一種很好的方法從哈希表中獲取布爾值?

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; 

是否有一個更好的布爾值解決方案?

回答

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

快樂編碼。

2

不要使用哈希表。那些已經過時了七年,因爲.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,涵蓋了主題...深入。

+0

我需要在字典中存儲其他非布爾型數據。 –

+2

也說它Hashtable已經過時。我查看了MSDN文檔中的任何內容,說它已經過時並且找不到任何東西。 –

+0

真的嗎?你去哪兒了?哈希表已嚴重過時。它不被棄用,如果這就是你要求的。你根本不應該使用Hashtable。 –

1

你應該使用一個通用的

Dictionary<string, bool> 

代替(過時)的Hashtable。

+0

該OP可能需要使用標籤並不是因爲他想要。例如,Photon PUN(視頻遊戲服務器)需要散列表。 –

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

您可以輕鬆地適應它在正確的地方特羅異常,或者日誌缺少值或類型不匹配。

0
bool bVal = false; 
object oVal; 
if (hash.TryGetValue("foo", out oVal)) { 
    bVal = (bool) oVal; 
} 
相關問題