2009-11-04 108 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