2009-11-04 57 views
1

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

在这里我的收藏将是这样的1-Machine1,1-Machine2,2-Machine1。 添加1-Machine1或2-Machine1应该是无效的条目。 请为此建议数据类型或方法。 我不能使用Dict>数据类型,因为它可能会妨碍性能,如果大小增长。

+0

是您的域集合的大小还是您担心的关于性能的机器集合的大小?字典应该是一个非常高性能的数据类型 - 它使用散列表来实现。 – Damovisa 2009-11-04 06:12:09

回答

2

对不起,但从您的描述看,它仍然听起来像一个字典实施将是一个很好的选择。

如果由于字典速度而导致应用程序性能下降,那么您可以重新访问该问题并推出自己专门定制的解决方案。

+0

不,我不能。如果我想使用字典,那么我必须保持DomainId为Key和List的MachineName作为值。对于每个值的添加,我必须检查第一个键是否存在,如果没有添加键。如果密钥存在,则检查值是否存在,如果没有,则将值添加到列表中,否则跳过加法。 相对看起来可能像是检查键是否存在,如果是,则检查列表中是否存在值,然后继续执行程序。 – mandar 2009-11-04 05:45:13

+0

我不认为你必须做这些检查。我用字典思考,你可以盲目地引用'myDomains [“domain1”]'。如果'domain1'条目已经存在,指向该条目。如果它不在,它会创建它。 – Damovisa 2009-11-04 06:21:10

0

您是否需要能够高效地查找给定计算机名称的域列表?否则Hashtable<String, HashSet<String>>似乎是一个不错的选择。

似乎还有一种叫做NameValueCollection的东西,如果您更改默认设置以使其不区分大小写或文化敏感,那么这可能非常合适。

+0

我m使用C#2.0.So不能使用HashSet – mandar 2009-11-04 06:05:18

+0

@mandar - 这是一个耻辱......任何特定的原因,你不能瞄准3.5? – Damovisa 2009-11-04 06:07:17

+0

对不起,但它是传统的应用程序,近4 - 5年前开发的。 – mandar 2009-11-04 06:11:31

0

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

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

编辑:

基于上述的评论,你可以只串连你的钥匙作为一个字符串,并使用一个HashSet检查您是否已经存储的密钥。

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类会做同样的事情。

+0

这不会阻止你做'映射[“1”]。再次添加(“Machine1”)'虽然...我相信机器必须是唯一的。 – Damovisa 2009-11-04 05:58:49

+0

是的,你必须做检查。 – 2009-11-04 06:04:16

1

因此,您需要某种具有唯一键的集合,并且此集合中的每个项目都是唯一的。

真的,你在谈论字典中字典中的值是一个独特的集合。

假设你只谈论字符串,我会使用类似:

Dictionary<string, HashSet<string>> 

有人纠正我,如果我错了,但我认为使用这些通用结构的好处是,你可以(就在蝙蝠旁边),请执行以下操作:

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

是的你说得对:“字典中的价值是一个独特的集合”。 但是有没有其他选择开始没有词典。我不介意“Key”(在这种情况下为domainId)重复。因为我只是添加或清除或迭代组合。可能是确保唯一键值组合的某种数据类型。 – mandar 2009-11-04 06:09:06

+0

我仍然不确定为什么有字典是一个问题。这是一个非常快速的基于密钥检索对象的结构。即使域名列表非常大,您仍然可以在O(1)次左右访问其机器列表。 – Damovisa 2009-11-04 06:15:21