C#中的唯一键值集合

时间:2009-11-04 05:34:29

标签: c# .net .net-2.0 collections

我想构建二维集合,我需要键值对的唯一组合。例如,域“公司”(Id:1)可以具有MachineName“Machine1”和“Machine2”,但不能再次添加另一个MachineName“Machine1”。另一个域“Corporate”(Id:2)可以有另一个machineName“Machine1”。

这里我的收藏品就像这个1-Machine1,1-Machine2,2-Machine1。 添加1-Machine1或2-Machine1应该是无效输入。 请为此建议数据类型或方法。 我不能用Dict>数据类型,因为如果大小增加,它可能会妨碍性能。

5 个答案:

答案 0 :(得分:2)

我很抱歉,但是根据你的描述,它仍然听起来像是一个字典实现很合适。

如果应用程序的性能因字典的速度而受到影响,那么您可以重新查看问题并推出自己专门定制的解决方案。

答案 1 :(得分:1)

你可以这样做:

Dictionary<String, List<String>> mapping = new Dictionary<string, List<string>>();
mapping.Add("1",new List<string>());
mapping["1"].Add("Machine1");
mapping["1"].Add("Machine2");

这将为您提供域和计算机之间的一对多映射。

NameValueCollection类也会这样做。

答案 2 :(得分:1)

所以你需要一种带有唯一键的集合,这个集合中的每个项目都是唯一的。

所以,你真的在​​谈论一本字典,其中字典中的值是一个独特的集合。

假设你只是在谈论字符串,我会使用类似的东西:

Dictionary<string, HashSet<string>>

如果我错了,有人会纠正我,但我认为使用这些通用结构的好处是你可以(马上蝙蝠),做到这一点:

Dictionary<string, HashSet<string>> domains = new Dictionary<string, HashSet<string>>();
domains["Domain1"].Add("Machine1");

答案 3 :(得分:0)

您是否需要能够有效地查找具有给定计算机名称的域列表?否则,Hashtable<String, HashSet<String>>似乎很合适。

如果更改默认值以使其不具有区分大小或文化敏感性,那么似乎还有一些名为NameValueCollection的东西可能是合适的。

答案 4 :(得分:0)

您没有说明这是一项要求,但我的猜测是您还需要能够查询特定“域”的所有计算机的数据结构。防爆。列出属于公司1的机器。这是我能想到使用字典的性能可能不可接受的唯一原因(因为你必须遍历整个列表才能找到所有匹配的条目)。

在这种情况下,您可以考虑将数据表示为树。

编辑:

根据您上面的评论,您可以将您的密钥连接为字符串,并使用HashSet检查您是否已经存储了该密钥。