2010-10-15 191 views
1

我對編程C#相當陌生,我寫了一個使用哈希表來存儲數據的程序(在我的情況下,用戶名,如果它們是「準備就緒」或「未準備就緒」,我總共有2個表。第一個表的鍵值是用戶名和IP地址,第二個表的鍵值爲Ready/Not Ready狀態(由組合框給出),IP地址爲值C#:使用哈希表來存儲兩個相同的值。可能嗎?

第一個表格不是問題,因爲我不想讓用戶名稱重新發生,但是在第二個表格中,我需要Ready/Not Ready狀態重新發生多次。這不起作用,因爲它說hashtable中已經有一個叫做「Ready」的鍵。有沒有辦法解決這個問題?

回答

3

你可以使用Dictionary<Status,HashSet<IP>>作爲第二個表格。這具有額外的優點,即插入/移除IP是快速的,因爲它是HashSet的關鍵。

+1

儘管爲區分雙重狀態值(就緒/未就緒),字典實際上看起來過度殺傷。 – 2010-10-15 22:13:03

+0

由於他談到了組合框而不是複選框,我不確定是否有兩個以上的狀態。如果只有兩個狀態,那麼使用兩個HashSet(每個狀態一個)肯定會是首選。 – CodesInChaos 2010-10-15 22:15:21

+0

是的,只有2個州。我基本上有3個值爲每個用戶(IP地址,用戶名,就緒/未就緒狀態)。有沒有辦法顯示哈希表的值字段而不是鍵? – 2010-10-15 23:01:46

0

鑰匙必須是唯一的。如果您試圖通過密鑰訪問某個值,它會如何知道您真正想要的是哪一個?

1

因此,第二個哈希表的原因是快速查找誰準備好或不準確,是否正確?

在這種情況下,考慮將其分成2個不同的集合:一個用於準備好的人,另一個用於那些不準備的人。

最有可能的是,一個簡單的List<T>在這裏會很好,因爲你只需要看看誰在那裏,而不是找到一個特定的(因爲如果你想這樣做,你可以看看另一個散列表) 。如果對哈希表具有類似的查找屬性很重要,則可以使用HashSet<T>,但這取決於您的需要。

+0

此外,我認爲通過「散列表」你是指這個概念,不一定是[HashTable](http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx)類 - 在大多數例如,[Dictionary](http://msdn.microsoft.com/en-us/library/xfhwa508.aspx)是一個更好的選擇,因爲類型安全。 – 2010-10-15 22:11:37

0

這聽起來像Hashtable可能不是您的問題的理想數據結構。

散列表/字典中的鍵必須是唯一的,所以不能,在技術上不能將兩個條目存儲在共享完全相同鍵的散列表中。

此外,您應該使用Dictionary<TKey, TValue)而不是實際的Hashtable類型,因爲它具有更好的性能特徵。

您可以模擬你想要做的東西像創建一個字典,它的值是什麼一組某種:

// Map containing two sets of IP addresses: those that are ready, 
// and those that are not ready. 
var readyMap = new Dictionary<bool, HashSet<string>>(); 
readyMap[true] = new HashSet<string>(); 
readyMap[false] = new HashSet<string>(); 

// Add an IP address that is ready. 
readyMap[true].Add(ipAddress1); 

// Add an IP address that is not ready. 
readyMap[false].Add(ipAddress2); 

然而,這可能不是理想的解決方案。你試圖解決的實際問題是什麼?

+0

基本上,我正在嘗試創建的解決方案非常類似於遊戲中的「Ready Up」系統,如果用戶已準備好開始遊戲,則會通知主持人。我應該發佈服務器和客戶端程序的代碼嗎? – 2010-10-15 22:52:48

+0

我不認爲你需要發佈整個程序的代碼。我想,有很多方法可以解決這個問題。 您可能考慮的另一種方法是擁有一組最初包含每個人的未就緒地址。當機器轉換到「就緒」狀態時,只需將其從「未就緒」設置中移除。當該集合爲空時,每個人都準備好了。 HashSet 再次是一個很好的選擇。 – mtreit 2010-10-15 23:13:23

+0

好的,我終於明白了這一點。我有3張桌子。第一個是密鑰:用戶名值:IP。其次是關鍵:IP值:用戶名。第三是關鍵:用戶名值:就緒/未就緒。然後我只需引用htReady.Value(哈希表)。我的整個代碼在這裏:http://pastebin.com/Z60GEjK8。你想要看的部分是類ChatServer,AddUser,RemoveUser和AcceptClient的開始。 – 2010-10-15 23:24:26

0

好的,我終於明白了這一點。我有3張桌子。第一個是密鑰:用戶名值:IP。其次是關鍵:IP值:用戶名。第三是關鍵:用戶名值:就緒/未就緒。然後我只需引用htReady.Value(哈希表)。我的整個代碼在這裏:http://pastebin.com/Z60GEjK8。你想要看的部分是類ChatServer,AddUser,RemoveUser和AcceptClient的開始。

我對此很陌生,所以如果你能提出一個更好的方法,我全都是耳朵。

相關問題