簡體   English   中英

C#:使用哈希表來存儲兩個相同的值。 可能嗎?

[英]C# : Using hashtables to store two of the same value. Is it possible?

我是編程C#的新手,我編寫了一個使用哈希表來存儲數據的程序(在我的例子中,用戶名,如果它們是“Ready”或“Not Ready”。我總共有2個表。第一個表在值框中具有密鑰作為用戶名和客戶端的IP地址。第二個表具有密鑰的就緒/未就緒狀態(由組合框給出),IP地址作為值。

第一個表不是問題,因為我不希望重新發生用戶名。 但是,在第二個表中,我需要多次重新發生就緒/未就緒狀態。 然而,這不起作用,因為它表示哈希表中已經有一個名為“Ready”的鍵。 有沒有辦法解決這個問題?

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

那么,第二個哈希表的原因是快速查找誰准備好了,對嗎?

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

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

鑰匙必須是獨一無二的。 如果你試圖通過密鑰訪問一個值,它怎么知道你真正想要的那個?

聽起來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);

但是,這可能不是理想的解決方案。 您要解決的實際問題是什么?

好的,我終於弄明白了。 我有3張桌子。 第一個是密鑰:用戶名值:IP。 第二是密鑰:IP值:用戶名。 第三是密鑰:用戶名值:就緒/未就緒。 然后我簡單地引用htReady.Value(哈希表)。 我的整個代碼在這里: http ://pastebin.com/Z60GEjK8。您要查看的部分是Class ChatServer,AddUser,RemoveUser和AcceptClient的開頭。

我是新手,所以如果你能提出一個更好的方法,我會全力以赴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM