C#:使用哈希表来存储两个相同的值。可能吗?

时间:2010-10-15 22:04:50

标签: c# key hashtable

我是编程C#的新手,我编写了一个程序,使用哈希表来存储数据(在我的例子中,用户名,如果它们是“就绪”或“未就绪”。我有2个表格第一个表在值框中有密钥作为用户名和客户端的IP地址。第二个表具有密钥的就绪/未就绪状态(由组合框给出),IP地址为价值。

第一个表不是问题,因为我不希望重新发生用户名。但是,在第二个表中,我需要多次重新发生就绪/未就绪状态。然而,这不起作用,因为它表示哈希表中已经有一个名为“Ready”的键。有没有办法解决这个问题?

5 个答案:

答案 0 :(得分:3)

您可以使用Dictionary<Status,HashSet<IP>>作为第二个表格。这具有额外的优点,即插入/移除IP很快,因为它是HashSet的密钥。

答案 1 :(得分:1)

那么,第二个哈希表的原因是要快速查找谁准备好了,对吗?

在这种情况下,请考虑将其分为两个不同的集合:一个用于准备好的人,另一个用于那些不准备的人。

最有可能的是,一个简单的List<T>会很好,因为你只需要看看谁在那里,而不是找到一个特定的(因为如果你想这样做,你可以看看其他哈希表)。如果对哈希表具有类似的查找属性很重要,则可以使用HashSet<T>代替,但这取决于您的需求。

答案 2 :(得分:0)

键必须是唯一的。如果你试图通过密钥访问一个值,它将如何知道你真正想要的那个?

答案 3 :(得分: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);

然而,这可能不是理想的解决方案。你想解决的实际问题是什么?

答案 4 :(得分:0)

好的,我终于弄明白了。我有3张桌子。第一个是密钥:用户名值:IP。第二是密钥:IP值:用户名。第三是密钥:用户名值:就绪/未就绪。然后我简单地引用htReady.Value(哈希表)。我的整个代码在这里:http://pastebin.com/Z60GEjK8。您要查看的部分是Class ChatServer,AddUser,RemoveUser和AcceptClient的开头。

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